packages feed

bz3-0.1.0.0: src/Codec/Bz3/Foreign.chs

module Codec.Bz3.Foreign ( Bz3St
                         , Bz3Error (..)
                         , bz3New
                         , bz3Free
                         , bz3Bound
                         , bz3Strerror
                         , bz3DecodeBlock
                         , bz3EncodeBlock
                         ) where

import Data.Int (Int32)
import Foreign.Ptr (Ptr)
import Foreign.C.Types (CSize)

#include<libbz3.h>

{# enum define Bz3Error { BZ3_OK as Bz3Ok
                        , BZ3_ERR_OUT_OF_BOUNDS as Bz3ErrOutOfBounds
                        , BZ3_ERR_BWT as Bz3ErrBwt
                        , BZ3_ERR_CRC as Bz3ErrCrc
                        , BZ3_ERR_MALFORMED_HEADER as Bz3ErrMalformedHeader
                        , BZ3_ERR_TRUNCATED_DATA as Bz3ErrTruncatedData
                        , BZ3_ERR_DATA_TOO_BIG as Bz3ErrDataTooBig
                        , BZ3_ERR_INIT as Bz3ErrInit
                        } deriving (Eq)
  #}

data Bz3St

{# pointer *bz3_state as Bz3StPtr foreign finalizer bz3_free as ^ -> Bz3St #}

type UInt8 = {# type uint8_t #}
{#typedef uint8_t UInt8#}
{#default in `Ptr UInt8' [uint8_t*] id#}

{#typedef int32_t Int32#}

{#typedef size_t CSize#}
{#default in `Ptr CSize' [size_t*] id#}

{# fun bz3_new as ^ { `Int32' } -> `Ptr Bz3St' id #}
{# fun pure bz3_bound as ^ { `CSize' } -> `CSize' #}
{# fun bz3_strerror as ^ { `Bz3StPtr' } -> `String' #}
{# fun bz3_decode_block as ^ { `Bz3StPtr', `Ptr UInt8', `CSize', `Int32', `Int32' } -> `Either Bz3Error Int32' bz3Err #}
{# fun bz3_encode_block as ^ { `Bz3StPtr', `Ptr UInt8', `Int32' } -> `Int32' #}

bz3Err :: Int32 -> Either Bz3Error Int32
bz3Err i | i > 0 = Right i
         | otherwise = Left$toEnum (fromIntegral i)