{-# LANGUAGE CApiFFI #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE Unsafe #-} {-# OPTIONS_GHC -fno-warn-dodgy-foreign-imports #-} -- Copyright (C) 2019 Herbert Valerio Riedel -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- | Primitive unsafe low-level FFI bindings to @lzlib@ module Codec.Compression.Lzlib.FFI ( -- * Parameter limits -- -- | See also in the @lzlib@ manual. c'LZ_min_dictionary_bits , c'LZ_min_dictionary_size , c'LZ_max_dictionary_size , c'LZ_max_dictionary_bits , c'LZ_min_match_len_limit , c'LZ_max_match_len_limit -- * Compression functions -- -- | See also in the @lzlib@ manual. , LzEncoder , c'LZ_compress_open , c'LZ_compress_close , cp'LZ_compress_close , c'LZ_compress_finish , c'LZ_compress_restart_member , c'LZ_compress_sync_flush , c'LZ_compress_read , c'LZ_compress_write , c'LZ_compress_write_size , c'LZ_compress_errno , c'LZ_compress_finished , c'LZ_compress_member_finished , c'LZ_compress_data_position , c'LZ_compress_member_position , c'LZ_compress_total_in_size , c'LZ_compress_total_out_size -- * Decompression functions -- -- | See also in the @lzlib@ manual. , LzDecoder , c'LZ_decompress_open , c'LZ_decompress_close , cp'LZ_decompress_close , c'LZ_decompress_finish , c'LZ_decompress_reset , c'LZ_decompress_sync_to_member , c'LZ_decompress_read , c'LZ_decompress_write , c'LZ_decompress_write_size , c'LZ_decompress_errno , c'LZ_decompress_finished , c'LZ_decompress_member_finished , c'LZ_decompress_member_version , c'LZ_decompress_dictionary_size , c'LZ_decompress_data_crc , c'LZ_decompress_data_position , c'LZ_decompress_member_position , c'LZ_decompress_total_in_size , c'LZ_decompress_total_out_size -- * Error codes -- -- | See also in the @lzlib@ manual. , C'LZ_Errno , LzErrno(..), toLzErrno -- * Internal , c'lzlib_version_check ) where import Foreign import Foreign.C import Internal #include "hs_lzlib.h" -- a non-zero value denotes failure foreign import capi unsafe "hs_lzlib.h hs_lzlib_version_check" c'lzlib_version_check :: CInt ---------------------------------------------------------------------------- -- Parameter limits foreign import capi unsafe "hs_lzlib.h LZ_min_dictionary_bits" c'LZ_min_dictionary_bits :: CInt foreign import capi unsafe "hs_lzlib.h LZ_min_dictionary_size" c'LZ_min_dictionary_size :: CInt foreign import capi unsafe "hs_lzlib.h LZ_max_dictionary_bits" c'LZ_max_dictionary_bits :: CInt foreign import capi unsafe "hs_lzlib.h LZ_max_dictionary_size" c'LZ_max_dictionary_size :: CInt foreign import capi unsafe "hs_lzlib.h LZ_min_match_len_limit" c'LZ_min_match_len_limit :: CInt foreign import capi unsafe "hs_lzlib.h LZ_max_match_len_limit" c'LZ_max_match_len_limit :: CInt ---------------------------------------------------------------------------- -- Compression functions foreign import capi "hs_lzlib.h LZ_compress_open" c'LZ_compress_open :: CInt -> CInt -> CULLong -> IO (Ptr LzEncoder) foreign import capi "hs_lzlib.h LZ_compress_close" c'LZ_compress_close :: Ptr LzEncoder -> IO CInt -- NB: we ignore the retval to match the type-sig of 'newForeignPtr' foreign import capi "hs_lzlib.h hs_lzlib_compress_close_addr" cp'LZ_compress_close :: FunPtr (Ptr LzEncoder -> IO ()) foreign import capi "hs_lzlib.h LZ_compress_finish" c'LZ_compress_finish :: Ptr LzEncoder -> IO CInt foreign import capi "hs_lzlib.h LZ_compress_restart_member" c'LZ_compress_restart_member :: Ptr LzEncoder -> CULLong -> IO CInt foreign import capi "hs_lzlib.h LZ_compress_sync_flush" c'LZ_compress_sync_flush :: Ptr LzEncoder -> IO CInt foreign import capi "hs_lzlib.h LZ_compress_read" c'LZ_compress_read :: Ptr LzEncoder -> Ptr Word8 -> CInt -> IO CInt foreign import capi "hs_lzlib.h LZ_compress_write" c'LZ_compress_write :: Ptr LzEncoder -> Ptr Word8 -> CInt -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_compress_write_size" c'LZ_compress_write_size :: Ptr LzEncoder -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_compress_errno" c'LZ_compress_errno :: Ptr LzEncoder -> IO C'LZ_Errno foreign import capi unsafe "hs_lzlib.h LZ_compress_finished" c'LZ_compress_finished :: Ptr LzEncoder -> IO CInt -- 0=False, 1=True foreign import capi unsafe "hs_lzlib.h LZ_compress_member_finished" c'LZ_compress_member_finished :: Ptr LzEncoder -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_compress_data_position" c'LZ_compress_data_position :: Ptr LzEncoder -> IO CULLong foreign import capi unsafe "hs_lzlib.h LZ_compress_member_position" c'LZ_compress_member_position :: Ptr LzEncoder -> IO CULLong foreign import capi unsafe "hs_lzlib.h LZ_compress_total_in_size" c'LZ_compress_total_in_size :: Ptr LzEncoder -> IO CULLong foreign import capi unsafe "hs_lzlib.h LZ_compress_total_out_size" c'LZ_compress_total_out_size :: Ptr LzEncoder -> IO CULLong ---------------------------------------------------------------------------- -- Decompression functions foreign import capi "hs_lzlib.h LZ_decompress_open" c'LZ_decompress_open :: IO (Ptr LzDecoder) foreign import capi "hs_lzlib.h LZ_decompress_close" c'LZ_decompress_close :: Ptr LzDecoder -> IO CInt -- NB: we ignore the retval to match the type-sig of 'newForeignPtr' foreign import capi "hs_lzlib.h hs_lzlib_decompress_close_addr" cp'LZ_decompress_close :: FunPtr (Ptr LzDecoder -> IO ()) foreign import capi "hs_lzlib.h LZ_decompress_finish" c'LZ_decompress_finish :: Ptr LzDecoder -> IO CInt foreign import capi "hs_lzlib.h LZ_decompress_reset" c'LZ_decompress_reset :: Ptr LzDecoder -> IO CInt foreign import capi "hs_lzlib.h LZ_decompress_sync_to_member" c'LZ_decompress_sync_to_member :: Ptr LzDecoder -> IO CInt foreign import capi "hs_lzlib.h LZ_decompress_read" c'LZ_decompress_read :: Ptr LzDecoder -> Ptr Word8 -> CInt -> IO CInt foreign import capi "hs_lzlib.h LZ_decompress_write" c'LZ_decompress_write :: Ptr LzDecoder -> Ptr Word8 -> CInt -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_decompress_write_size" c'LZ_decompress_write_size :: Ptr LzDecoder -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_decompress_errno" c'LZ_decompress_errno :: Ptr LzDecoder -> IO C'LZ_Errno foreign import capi unsafe "hs_lzlib.h LZ_decompress_finished" c'LZ_decompress_finished :: Ptr LzDecoder -> IO CInt -- 0=False, 1=True foreign import capi unsafe "hs_lzlib.h LZ_decompress_member_finished" c'LZ_decompress_member_finished :: Ptr LzDecoder -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_decompress_member_version" c'LZ_decompress_member_version :: Ptr LzDecoder -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_decompress_dictionary_size" c'LZ_decompress_dictionary_size :: Ptr LzDecoder -> IO CInt foreign import capi unsafe "hs_lzlib.h LZ_decompress_data_crc" c'LZ_decompress_data_crc :: Ptr LzDecoder -> IO CUInt foreign import capi unsafe "hs_lzlib.h LZ_decompress_data_position" c'LZ_decompress_data_position :: Ptr LzDecoder -> IO CULLong foreign import capi unsafe "hs_lzlib.h LZ_decompress_member_position" c'LZ_decompress_member_position :: Ptr LzDecoder -> IO CULLong foreign import capi unsafe "hs_lzlib.h LZ_decompress_total_in_size" c'LZ_decompress_total_in_size :: Ptr LzDecoder -> IO CULLong foreign import capi unsafe "hs_lzlib.h LZ_decompress_total_out_size" c'LZ_decompress_total_out_size :: Ptr LzDecoder -> IO CULLong ---------------------------------------------------------------------------- -- Error codes type C'LZ_Errno = #{type enum LZ_Errno} -- | @lzlib@ error codes -- -- See for more details. data LzErrno = LzOk | LzBadArgument | LzMemError | LzSequenceError | LzHeaderError | LzUnexpectedEof | LzDataError | LzLibraryError | LzUnknown -- ^ not defined by @lzlib@ deriving (Eq,Show,Typeable) instance Exception LzErrno -- | Convert FFI @enum LZ_Errno@ into the Haskell enum type 'LzErrno'. toLzErrno :: C'LZ_Errno -> LzErrno toLzErrno eno = case eno of #{const LZ_ok} -> LzOk #{const LZ_bad_argument} -> LzBadArgument #{const LZ_mem_error} -> LzMemError #{const LZ_sequence_error} -> LzSequenceError #{const LZ_header_error} -> LzHeaderError #{const LZ_unexpected_eof} -> LzUnexpectedEof #{const LZ_data_error} -> LzDataError #{const LZ_library_error} -> LzLibraryError _ -> LzUnknown