From 1c108c811ecf25686d78dd5e2144d72de990294d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sat, 19 Aug 2017 13:33:50 -0700 Subject: [PATCH] cli : Display supported formats on -vV command Requested and inspired by patch from @ib (#771) --- programs/.gitignore | 1 + programs/Makefile | 2 +- programs/README.md | 13 +++++++++++- programs/zstd.1 | 4 ++-- programs/zstd.1.md | 4 +++- programs/zstdcli.c | 51 ++++++++++++++++++++++++++++++++------------- 6 files changed, 55 insertions(+), 20 deletions(-) diff --git a/programs/.gitignore b/programs/.gitignore index a012ce2e..701830c7 100644 --- a/programs/.gitignore +++ b/programs/.gitignore @@ -1,6 +1,7 @@ # local binary (Makefile) zstd zstd32 +zstd4 zstd-compress zstd-decompress zstd-frugal diff --git a/programs/Makefile b/programs/Makefile index 4cfb05e2..c5469cfc 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -225,7 +225,7 @@ clean: @$(RM) $(ZSTDDIR)/decompress/*.o $(ZSTDDIR)/decompress/zstd_decompress.gcda @$(RM) core *.o tmp* result* *.gcda dictionary *.zst \ zstd$(EXT) zstd32$(EXT) zstd-compress$(EXT) zstd-decompress$(EXT) \ - zstd-small$(EXT) zstd-frugal$(EXT) zstd-nolegacy$(EXT) \ + zstd-small$(EXT) zstd-frugal$(EXT) zstd-nolegacy$(EXT) zstd4$(EXT) \ *.gcda default.profraw have_zlib$(EXT) @echo Cleaning completed diff --git a/programs/README.md b/programs/README.md index 3ac2c8f6..8b65dfdb 100644 --- a/programs/README.md +++ b/programs/README.md @@ -11,7 +11,7 @@ There are however other Makefile targets that create different variations of CLI #### Compilation variables -`zstd` tries to detect and use the following features automatically : +`zstd` scope can be altered by modifying the following compilation variables : - __HAVE_THREAD__ : multithreading is automatically enabled when `pthread` is detected. It's possible to disable multithread support, by setting HAVE_THREAD=0 . @@ -40,6 +40,17 @@ There are however other Makefile targets that create different variations of CLI In which case, linking stage will fail if `lzma` library cannot be found. This might be useful to prevent silent feature disabling. +- __ZSTD_LEGACY_SUPPORT__ : `zstd` can decompress files compressed by older versions of `zstd`. + Starting v0.8.0, all versions of `zstd` produce frames compliant with the [specification](../doc/zstd_compression_format.md), and are therefore compatible. + But older versions (< v0.8.0) produced different, incompatible, frames. + By default, `zstd` supports decoding legacy formats >= v0.4.0 (`ZSTD_LEGACY_SUPPORT=4`). + This can be altered by modifying this compilation variable. + `ZSTD_LEGACY_SUPPORT=1` means "support all formats >= v0.1.0". + `ZSTD_LEGACY_SUPPORT=2` means "support all formats >= v0.2.0", and so on. + `ZSTD_LEGACY_SUPPORT=0` means _DO NOT_ support any legacy format. + if `ZSTD_LEGACY_SUPPORT >= 8`, it's the same as `0`, since there is no legacy format after `7`. + Note : `zstd` only supports decoding older formats, and cannot generate any legacy format. + #### Aggregation of parameters CLI supports aggregation of parameters i.e. `-b1`, `-e18`, and `-i1` can be joined into `-b1e18i1`. diff --git a/programs/zstd.1 b/programs/zstd.1 index 2b80659c..5a91eea2 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,5 +1,5 @@ . -.TH "ZSTD" "1" "July 2017" "zstd 1.3.1" "User Commands" +.TH "ZSTD" "1" "August 2017" "zstd 1.3.1" "User Commands" . .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files @@ -149,7 +149,7 @@ display help/long help and exit . .TP \fB\-V\fR, \fB\-\-version\fR -display version number and exit +display version number and exit\. Advanced : \fB\-vV\fR also displays supported formats\. \fB\-vvV\fR also displays POSIX support\. . .TP \fB\-v\fR diff --git a/programs/zstd.1.md b/programs/zstd.1.md index ba51c843..4310afa1 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -140,7 +140,9 @@ the last one takes effect. * `-h`/`-H`, `--help`: display help/long help and exit * `-V`, `--version`: - display version number and exit + display version number and exit. + Advanced : `-vV` also displays supported formats. + `-vvV` also displays POSIX support. * `-v`: verbose mode * `-q`, `--quiet`: diff --git a/programs/zstdcli.c b/programs/zstdcli.c index d2bbf5d8..e7eb71db 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -16,7 +16,7 @@ #endif #ifndef ZSTDCLI_CLEVEL_MAX -# define ZSTDCLI_CLEVEL_MAX 19 /* when not using --ultra */ +# define ZSTDCLI_CLEVEL_MAX 19 /* without using --ultra */ #endif @@ -26,14 +26,15 @@ **************************************/ #include "platform.h" /* IS_CONSOLE, PLATFORM_POSIX_VERSION */ #include "util.h" /* UTIL_HAS_CREATEFILELIST, UTIL_createFileList */ +#include /* fprintf(), stdin, stdout, stderr */ #include /* strcmp, strlen */ #include /* errno */ -#include "fileio.h" +#include "fileio.h" /* stdinmark, stdoutmark, ZSTD_EXTENSION */ #ifndef ZSTD_NOBENCH # include "bench.h" /* BMK_benchFiles, BMK_SetNbSeconds */ #endif #ifndef ZSTD_NODICT -# include "dibio.h" +# include "dibio.h" /* ZDICT_cover_params_t, DiB_trainFromFiles() */ #endif #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_maxCLevel */ #include "zstd.h" /* ZSTD_VERSION_STRING */ @@ -64,7 +65,7 @@ #define MB *(1 <<20) #define GB *(1U<<30) -#define DEFAULT_DISPLAY_LEVEL 2 +#define DISPLAY_LEVEL_DEFAULT 2 static const char* g_defaultDictName = "dictionary"; static const unsigned g_defaultMaxDictSize = 110 KB; @@ -79,7 +80,7 @@ static U32 g_overlapLog = OVERLAP_LOG_DEFAULT; **************************************/ #define DISPLAY(...) fprintf(g_displayOut, __VA_ARGS__) #define DISPLAYLEVEL(l, ...) { if (g_displayLevel>=l) { DISPLAY(__VA_ARGS__); } } -static int g_displayLevel = DEFAULT_DISPLAY_LEVEL; /* 0 : no display, 1: errors, 2 : + result + interaction + warnings, 3 : + progression, 4 : + information */ +static int g_displayLevel = DISPLAY_LEVEL_DEFAULT; /* 0 : no display, 1: errors, 2 : + result + interaction + warnings, 3 : + progression, 4 : + information */ static FILE* g_displayOut; @@ -312,6 +313,35 @@ static unsigned parseCompressionParameters(const char* stringPtr, ZSTD_compressi return 1; } +static void printVersion(void) +{ + DISPLAY(WELCOME_MESSAGE); + /* format support */ + DISPLAYLEVEL(3, "*** supports: zstd"); +#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>0) && (ZSTD_LEGACY_SUPPORT<8) + DISPLAYLEVEL(3, ", zstd legacy v0.%d+", ZSTD_LEGACY_SUPPORT); +#endif +#ifdef ZSTD_GZCOMPRESS + DISPLAYLEVEL(3, ", gzip"); +#endif +#ifdef ZSTD_LZ4COMPRESS + DISPLAYLEVEL(3, ", lz4"); +#endif +#ifdef ZSTD_LZMACOMPRESS + DISPLAYLEVEL(3, ", lzma, xz "); +#endif + DISPLAYLEVEL(3, "\n"); + /* posix support */ +#ifdef _POSIX_C_SOURCE + DISPLAYLEVEL(4, "_POSIX_C_SOURCE defined: %ldL\n", (long) _POSIX_C_SOURCE); +#endif +#ifdef _POSIX_VERSION + DISPLAYLEVEL(4, "_POSIX_VERSION defined: %ldL \n", (long) _POSIX_VERSION); +#endif +#ifdef PLATFORM_POSIX_VERSION + DISPLAYLEVEL(4, "PLATFORM_POSIX_VERSION defined: %ldL\n", (long) PLATFORM_POSIX_VERSION); +#endif +} typedef enum { zom_compress, zom_decompress, zom_test, zom_bench, zom_train, zom_list } zstd_operation_mode; @@ -491,7 +521,7 @@ int main(int argCount, const char* argv[]) switch(argument[0]) { /* Display help */ - case 'V': g_displayOut=stdout; DISPLAY(WELCOME_MESSAGE); CLEAN_RETURN(0); /* Version Only */ + case 'V': g_displayOut=stdout; printVersion(); CLEAN_RETURN(0); /* Version Only */ case 'H': case 'h': g_displayOut=stdout; CLEAN_RETURN(usage_advanced(programName)); @@ -641,15 +671,6 @@ int main(int argCount, const char* argv[]) /* Welcome message (if verbose) */ DISPLAYLEVEL(3, WELCOME_MESSAGE); -#ifdef _POSIX_C_SOURCE - DISPLAYLEVEL(4, "_POSIX_C_SOURCE defined: %ldL\n", (long) _POSIX_C_SOURCE); -#endif -#ifdef _POSIX_VERSION - DISPLAYLEVEL(4, "_POSIX_VERSION defined: %ldL \n", (long) _POSIX_VERSION); -#endif -#ifdef PLATFORM_POSIX_VERSION - DISPLAYLEVEL(4, "PLATFORM_POSIX_VERSION defined: %ldL\n", (long) PLATFORM_POSIX_VERSION); -#endif if (nbThreads == 0) { /* try to guess */