Skip to content

Commit 26838cf

Browse files
committed
Add Zstandard read support
1 parent f2230fc commit 26838cf

11 files changed

Lines changed: 342 additions & 0 deletions

CMakeLists.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,29 @@ IF(LZ4_FOUND)
533533
ENDIF(LZ4_FOUND)
534534
MARK_AS_ADVANCED(CLEAR LZ4_INCLUDE_DIR)
535535
MARK_AS_ADVANCED(CLEAR LZ4_LIBRARY)
536+
#
537+
# Find Zstd
538+
#
539+
IF (ZSTD_INCLUDE_DIR)
540+
# Already in cache, be silent
541+
SET(ZSTD_FIND_QUIETLY TRUE)
542+
ENDIF (ZSTD_INCLUDE_DIR)
543+
544+
FIND_PATH(ZSTD_INCLUDE_DIR zstd.h)
545+
FIND_LIBRARY(ZSTD_LIBRARY NAMES zstd libzstd)
546+
INCLUDE(FindPackageHandleStandardArgs)
547+
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZSTD DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR)
548+
IF(ZSTD_FOUND)
549+
SET(HAVE_LIBZSTD 1)
550+
SET(HAVE_ZSTD_H 1)
551+
INCLUDE_DIRECTORIES(${ZSTD_INCLUDE_DIR})
552+
LIST(APPEND ADDITIONAL_LIBS ${ZSTD_LIBRARY})
553+
#
554+
# TODO: test for static library.
555+
#
556+
ENDIF(ZSTD_FOUND)
557+
MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
558+
MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)
536559

537560
#
538561
# Check headers

Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ libarchive_la_SOURCES= \
161161
libarchive/archive_read_support_filter_gzip.c \
162162
libarchive/archive_read_support_filter_lrzip.c \
163163
libarchive/archive_read_support_filter_lz4.c \
164+
libarchive/archive_read_support_filter_zstd.c \
164165
libarchive/archive_read_support_filter_lzop.c \
165166
libarchive/archive_read_support_filter_none.c \
166167
libarchive/archive_read_support_filter_program.c \

build/cmake/config.h.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,9 @@ typedef uint64_t uintmax_t;
695695
/* Define to 1 if you have the `lz4' library (-llz4). */
696696
#cmakedefine HAVE_LIBLZ4 1
697697

698+
/* Define to 1 if you have the `zstd' library (-lzstd). */
699+
#cmakedefine HAVE_LIBZSTD 1
700+
698701
/* Define to 1 if you have the `lzma' library (-llzma). */
699702
#cmakedefine HAVE_LIBLZMA 1
700703

@@ -792,6 +795,9 @@ typedef uint64_t uintmax_t;
792795
/* Define to 1 if you have the <lz4.h> header file. */
793796
#cmakedefine HAVE_LZ4_H 1
794797

798+
/* Define to 1 if you have the <zstd.h> header file. */
799+
#cmakedefine HAVE_ZSTD_H 1
800+
795801
/* Define to 1 if you have the <lzmadec.h> header file. */
796802
#cmakedefine HAVE_LZMADEC_H 1
797803

configure.ac

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,14 @@ if test "x$with_lz4" != "xno"; then
367367
AC_CHECK_LIB(lz4,LZ4_decompress_safe)
368368
fi
369369

370+
AC_ARG_WITH([zstd],
371+
AS_HELP_STRING([--without-zstd], [Don't build support for zstd through libzstd]))
372+
373+
if test "x$with_zstd" != "xno"; then
374+
AC_CHECK_HEADERS([zstd.h])
375+
AC_CHECK_LIB(zstd,ZSTD_decompress)
376+
fi
377+
370378
AC_ARG_WITH([lzma],
371379
AS_HELP_STRING([--without-lzma], [Don't build support for xz through lzma]))
372380

contrib/android/Android.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ libarchive_src_files := libarchive/archive_acl.c \
6868
libarchive/archive_read_support_filter_gzip.c \
6969
libarchive/archive_read_support_filter_lrzip.c \
7070
libarchive/archive_read_support_filter_lz4.c \
71+
libarchive/archive_read_support_filter_zstd.c \
7172
libarchive/archive_read_support_filter_lzop.c \
7273
libarchive/archive_read_support_filter_none.c \
7374
libarchive/archive_read_support_filter_program.c \

libarchive/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ SET(libarchive_SOURCES
8282
archive_read_support_filter_grzip.c
8383
archive_read_support_filter_lrzip.c
8484
archive_read_support_filter_lz4.c
85+
archive_read_support_filter_zstd.c
8586
archive_read_support_filter_lzop.c
8687
archive_read_support_filter_none.c
8788
archive_read_support_filter_program.c

libarchive/archive.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ typedef const char *archive_passphrase_callback(struct archive *,
276276
#define ARCHIVE_FILTER_LZOP 11
277277
#define ARCHIVE_FILTER_GRZIP 12
278278
#define ARCHIVE_FILTER_LZ4 13
279+
#define ARCHIVE_FILTER_ZSTD 14
279280

280281
#if ARCHIVE_VERSION_NUMBER < 4000000
281282
#define ARCHIVE_COMPRESSION_NONE ARCHIVE_FILTER_NONE
@@ -421,6 +422,7 @@ __LA_DECL int archive_read_support_filter_gzip(struct archive *);
421422
__LA_DECL int archive_read_support_filter_grzip(struct archive *);
422423
__LA_DECL int archive_read_support_filter_lrzip(struct archive *);
423424
__LA_DECL int archive_read_support_filter_lz4(struct archive *);
425+
__LA_DECL int archive_read_support_filter_zstd(struct archive *);
424426
__LA_DECL int archive_read_support_filter_lzip(struct archive *);
425427
__LA_DECL int archive_read_support_filter_lzma(struct archive *);
426428
__LA_DECL int archive_read_support_filter_lzop(struct archive *);
@@ -770,6 +772,7 @@ __LA_DECL int archive_write_add_filter_grzip(struct archive *);
770772
__LA_DECL int archive_write_add_filter_gzip(struct archive *);
771773
__LA_DECL int archive_write_add_filter_lrzip(struct archive *);
772774
__LA_DECL int archive_write_add_filter_lz4(struct archive *);
775+
__LA_DECL int archive_write_add_filter_zstd(struct archive *);
773776
__LA_DECL int archive_write_add_filter_lzip(struct archive *);
774777
__LA_DECL int archive_write_add_filter_lzma(struct archive *);
775778
__LA_DECL int archive_write_add_filter_lzop(struct archive *);

libarchive/archive_read_append_filter.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ archive_read_append_filter(struct archive *_a, int code)
8989
strcpy(str, "lz4");
9090
r1 = archive_read_support_filter_lz4(_a);
9191
break;
92+
case ARCHIVE_FILTER_ZSTD:
93+
strcpy(str, "zstd");
94+
r1 = archive_read_support_filter_zstd(_a);
95+
break;
9296
case ARCHIVE_FILTER_LZIP:
9397
strcpy(str, "lzip");
9498
r1 = archive_read_support_filter_lzip(_a);

libarchive/archive_read_filter.3

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
.Nm archive_read_support_filter_compress ,
3434
.Nm archive_read_support_filter_gzip ,
3535
.Nm archive_read_support_filter_lz4 ,
36+
.Nm archive_read_support_filter_zstd ,
3637
.Nm archive_read_support_filter_lzma ,
3738
.Nm archive_read_support_filter_none ,
3839
.Nm archive_read_support_filter_rpm ,
@@ -61,6 +62,8 @@ Streaming Archive Library (libarchive, -larchive)
6162
.Ft int
6263
.Fn archive_read_support_filter_lz4 "struct archive *"
6364
.Ft int
65+
.Fn archive_read_support_filter_zstd "struct archive *"
66+
.Ft int
6467
.Fn archive_read_support_filter_lzma "struct archive *"
6568
.Ft int
6669
.Fn archive_read_support_filter_lzop "struct archive *"
@@ -94,6 +97,7 @@ Streaming Archive Library (libarchive, -larchive)
9497
.Fn archive_read_support_filter_gzip ,
9598
.Fn archive_read_support_filter_lrzip ,
9699
.Fn archive_read_support_filter_lz4 ,
100+
.Fn archive_read_support_filter_zstd ,
97101
.Fn archive_read_support_filter_lzma ,
98102
.Fn archive_read_support_filter_lzop ,
99103
.Fn archive_read_support_filter_none ,

libarchive/archive_read_support_filter_all.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ archive_read_support_filter_all(struct archive *a)
7171
archive_read_support_filter_grzip(a);
7272
/* Lz4 falls back to "lz4 -d" command-line program. */
7373
archive_read_support_filter_lz4(a);
74+
/* Zstd falls back to "zstd -d" command-line program. */
75+
archive_read_support_filter_zstd(a);
7476

7577
/* Note: We always return ARCHIVE_OK here, even if some of the
7678
* above return ARCHIVE_WARN. The intent here is to enable

0 commit comments

Comments
 (0)