module Codec.Compression.QuickLZ
(
compress
, decompress
) where
import Foreign
import Foreign.C
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Internal as SI
import qualified Data.ByteString.Unsafe as U
compress :: S.ByteString -> S.ByteString
compress xs
| S.null xs = S.empty
| otherwise =
unsafePerformIO . allocaBytes qlz_state_compress_sz $ \compress_state ->
SI.createAndTrim (S.length xs + 400) $ \output -> do
U.unsafeUseAsCStringLen xs $ \(cstr,len) ->
c_qlz_compress cstr output len compress_state
decompress :: S.ByteString -> S.ByteString
decompress xs
| S.null xs = S.empty
| otherwise =
unsafePerformIO . allocaBytes qlz_state_decompress_sz $ \decompress_state -> do
sz <- U.unsafeUseAsCString xs c_qlz_size_decompressed
SI.createAndTrim sz $ \output -> do
U.unsafeUseAsCString xs $ \cstr ->
c_qlz_decompress cstr output decompress_state
qlz_state_compress_sz :: Int
qlz_state_compress_sz = (36868)
qlz_state_decompress_sz :: Int
qlz_state_decompress_sz = (20484)
foreign import ccall unsafe "quicklz.h qlz_compress"
c_qlz_compress :: Ptr a -> Ptr b -> Int -> Ptr c -> IO Int
foreign import ccall unsafe "quicklz.h qlz_decompress"
c_qlz_decompress :: Ptr a -> Ptr b -> Ptr c -> IO Int
foreign import ccall unsafe "quicklz.h qlz_size_decompressed"
c_qlz_size_decompressed :: CString -> IO Int