diff --git a/src/encoding/brotli.c b/src/encoding/brotli.c index 85f8a405..25f56e15 100644 --- a/src/encoding/brotli.c +++ b/src/encoding/brotli.c @@ -175,6 +175,23 @@ brotli_close(struct stream_encoded *stream) } } +const char * +get_brotli_version(void) +{ + static char version[16]; + + if (!version[0]) { + int v = BrotliDecoderVersion(); + int major = v >> 24; + int minor = (v >> 12) & 0xFFF; + int patch = v & 0xFFF; + + snprintf(version, 15, "%d.%d.%d", major, minor, patch); + } + + return version; +} + static const char *const brotli_extensions[] = { ".br", NULL }; const struct decoding_backend brotli_decoding_backend = { diff --git a/src/encoding/brotli.h b/src/encoding/brotli.h index b8972cb6..ef193362 100644 --- a/src/encoding/brotli.h +++ b/src/encoding/brotli.h @@ -9,6 +9,8 @@ extern "C" { #ifdef CONFIG_BROTLI extern const struct decoding_backend brotli_decoding_backend; +const char *get_brotli_version(void); + #else #define brotli_decoding_backend dummy_decoding_backend #endif diff --git a/src/encoding/bzip2.c b/src/encoding/bzip2.c index 45ded820..99636767 100644 --- a/src/encoding/bzip2.c +++ b/src/encoding/bzip2.c @@ -212,6 +212,22 @@ bzip2_close(struct stream_encoded *stream) } } +const char * +get_bzip2_version(void) +{ + static char version[16]; + + if (!version[0]) { + strncpy(version, BZ2_bzlibVersion(), 15); + + size_t ok = strspn(version, "0123456789."); + + version[ok] = '\0'; + } + + return version; +} + static const char *const bzip2_extensions[] = { ".bz2", ".tbz", NULL }; const struct decoding_backend bzip2_decoding_backend = { diff --git a/src/encoding/bzip2.h b/src/encoding/bzip2.h index b25a2ce1..0102b171 100644 --- a/src/encoding/bzip2.h +++ b/src/encoding/bzip2.h @@ -9,6 +9,7 @@ extern "C" { #ifdef CONFIG_BZIP2 extern const struct decoding_backend bzip2_decoding_backend; +const char *get_bzip2_version(void); #else #define bzip2_decoding_backend dummy_decoding_backend #endif diff --git a/src/encoding/gzip.c b/src/encoding/gzip.c index 523af22d..e5ee99b4 100644 --- a/src/encoding/gzip.c +++ b/src/encoding/gzip.c @@ -250,6 +250,12 @@ deflate_close(struct stream_encoded *stream) } } +const char * +get_gzip_version(void) +{ + return zlibVersion(); +} + static const char *const gzip_extensions[] = { ".gz", ".tgz", NULL }; const struct decoding_backend gzip_decoding_backend = { diff --git a/src/encoding/gzip.h b/src/encoding/gzip.h index 98d4c315..c861af5a 100644 --- a/src/encoding/gzip.h +++ b/src/encoding/gzip.h @@ -9,6 +9,7 @@ extern "C" { #ifdef CONFIG_GZIP extern const struct decoding_backend gzip_decoding_backend; +const char *get_gzip_version(void); #else #define gzip_decoding_backend dummy_decoding_backend #endif diff --git a/src/encoding/lzma.c b/src/encoding/lzma.c index bc35f854..b079881a 100644 --- a/src/encoding/lzma.c +++ b/src/encoding/lzma.c @@ -176,6 +176,12 @@ lzma_close(struct stream_encoded *stream) } } +const char * +get_lzma_version(void) +{ + return lzma_version_string(); +} + static const char *const lzma_extensions[] = { ".lzma", ".xz", NULL }; const struct decoding_backend lzma_decoding_backend = { diff --git a/src/encoding/lzma.h b/src/encoding/lzma.h index 08d28d99..7bf44fc1 100644 --- a/src/encoding/lzma.h +++ b/src/encoding/lzma.h @@ -9,6 +9,7 @@ extern "C" { #ifdef CONFIG_LZMA extern const struct decoding_backend lzma_decoding_backend; +const char *get_lzma_version(void); #else #define lzma_decoding_backend dummy_decoding_backend #endif diff --git a/src/encoding/zstd.c b/src/encoding/zstd.c index aca2e368..f5b6d59e 100644 --- a/src/encoding/zstd.c +++ b/src/encoding/zstd.c @@ -170,6 +170,12 @@ zstd_close(struct stream_encoded *stream) } } +const char * +get_zstd_version(void) +{ + return ZSTD_versionString(); +} + static const char *const zstd_extensions[] = { ".zst", NULL }; const struct decoding_backend zstd_decoding_backend = { diff --git a/src/encoding/zstd.h b/src/encoding/zstd.h index f67ad706..4c34d38b 100644 --- a/src/encoding/zstd.h +++ b/src/encoding/zstd.h @@ -9,6 +9,7 @@ extern "C" { #ifdef CONFIG_ZSTD extern const struct decoding_backend zstd_decoding_backend; +const char *get_zstd_version(void); #else #define zstd_decoding_backend dummy_decoding_backend #endif diff --git a/src/main/version.c b/src/main/version.c index 94056929..6caf7a42 100644 --- a/src/main/version.c +++ b/src/main/version.c @@ -13,6 +13,22 @@ #include "elinks.h" +#ifdef CONFIG_BROTLI +#include "encoding/brotli.h" +#endif +#ifdef CONFIG_GZIP +#include "encoding/gzip.h" +#endif +#ifdef CONFIG_BZIP2 +#include "encoding/bzip2.h" +#endif +#ifdef CONFIG_LZMA +#include "encoding/lzma.h" +#endif +#ifdef CONFIG_ZSTD +#include "encoding/zstd.h" +#endif + #include "intl/libintl.h" #include "main/module.h" #include "main/version.h" @@ -132,19 +148,19 @@ get_dyn_full_version(struct terminal *term, int more) comma, "IPv6", #endif #ifdef CONFIG_BROTLI - comma, "brotli", + comma, "brotli(", get_brotli_version(),")", #endif #ifdef CONFIG_GZIP - comma, "gzip", + comma, "gzip(", get_gzip_version(),")", #endif #ifdef CONFIG_BZIP2 - comma, "bzip2", + comma, "bzip2(", get_bzip2_version(), ")", #endif #ifdef CONFIG_LZMA - comma, "lzma", + comma, "lzma(", get_lzma_version(), ")", #endif #ifdef CONFIG_ZSTD - comma, "zstd", + comma, "zstd(", get_zstd_version(), ")", #endif #ifndef CONFIG_MOUSE comma, _("No mouse", term),