COMPRESSION: Add Zstandard compression support.

Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
Grzegorz Kowal 2020-08-10 16:48:31 -03:00
parent 8b475b880b
commit 053392e762
2 changed files with 39 additions and 1 deletions

View File

@ -72,3 +72,13 @@ option(ENABLE_SIGNALS "Enables signal handler support" ON)
if(ENABLE_SIGNALS)
target_compile_definitions(amun.x PRIVATE SIGNALS)
endif()
option(ENABLE_ZSTD "Enable Zstandard compression support" ON)
if(ENABLE_ZSTD)
include(FindPkgConfig)
pkg_search_module(ZSTD QUIET libzstd)
if(ZSTD_FOUND)
target_compile_definitions(amun.x PRIVATE ZSTD)
target_link_libraries(amun.x ${ZSTD_LIBRARIES})
endif()
endif()

View File

@ -29,10 +29,27 @@
!
module compression
use iso_c_binding, only: c_int, c_loc
! module variables are not implicit by default
!
implicit none
! interfaces to compression algorithms
!
#ifdef ZSTD
interface
integer(c_int) function zstd_compress(obuf, osize, ibuf, isize, lev) &
bind(C, name="ZSTD_compress")
use iso_c_binding, only: c_size_t, c_int, c_ptr
implicit none
integer(kind=c_size_t), value :: osize, isize
type(c_ptr), value :: obuf, ibuf
integer(kind=c_int), value :: lev
end function zstd_compress
end interface
#endif /* ZSTD */
! compression parameters
!
integer, save :: compression_format = 0
@ -40,7 +57,7 @@ module compression
! supported compression formats
!
integer, parameter :: compression_none = 0
integer, parameter :: compression_none = 0, compression_zstd = 1
! by default everything is private
!
@ -88,6 +105,12 @@ module compression
!-------------------------------------------------------------------------------
!
select case(trim(adjustl(cformat)))
#ifdef ZSTD
case("zstd", "ZSTD", "zst", "ZST", "Zstandard")
compression_format = compression_zstd
compression_level = max(0, min(19, clevel))
suffix = ".zst"
#endif /* ZSTD */
case default
compression_format = compression_none
compression_level = clevel
@ -148,6 +171,11 @@ module compression
!
csize = min(size(input), size(output))
select case(compression_format)
#ifdef ZSTD
case(compression_zstd)
csize = zstd_compress(c_loc(output), sizeof(output), &
c_loc(input), sizeof(input), compression_level)
#endif /* ZSTD */
case default
output(1:csize) = input(1:csize)
end select