--------------------------------------------------------------------
-- |
-- Module    : Example.Constants
-- Copyright : (c) Galois, Inc. 2008
-- License   : BSD3
--
-- Maintainer: Don Stewart <dons@galois.com>
-- Stability : provisional
-- Portability:
--
--------------------------------------------------------------------


module Constants where

import Foreign
import Foreign.C.String
import Foreign.C.Types
import Data.Map as M
import qualified Data.ByteString.Unsafe as S
import qualified Data.ByteString        as S
import qualified Data.ByteString.Lazy   as L
import Data.Binary
import Codec.Compression.GZip

------------------------------------------------------------------------
-- Example 1:
--
-- Import a small constant byte array on the C side as a Haskell value.
--
example1 :: S.ByteString
example1 = unsafePerformIO $
            S.unsafePackCString =<< c_constant_cstring

foreign import ccall unsafe "constant_cstring" 
    c_constant_cstring :: IO CString

------------------------------------------------------------------------
-- Example 2:
--
-- Import a gzip-compressed (Map ByteString Int) from C.
--
example2 :: M.Map S.ByteString Int
example2 = unsafePerformIO $ do
    n <- c_constant_beowulf_size
    s <- c_constant_beowulf
    b <- S.unsafePackCStringLen (castPtr s,fromIntegral n)
    return $ decode . decompress . L.fromChunks . return $ b

foreign import ccall unsafe "beowulf_array" 
    c_constant_beowulf :: IO (Ptr Word8)

foreign import ccall unsafe "beowulf_size" 
    c_constant_beowulf_size :: IO CLong

