COMPRESSION: Add Zstandard compression support.
Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
parent
8b475b880b
commit
053392e762
@ -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()
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user