{-# LINE 1 "src/Exomizer/Extern/Membuf.chs" #-}
module Exomizer.Extern.Membuf
( Membuf
, withMembuf
, membufAppend
, membufGet
) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import qualified Foreign.Storable as C2HSImp
import Control.Monad
import Data.ByteString
import Data.ByteString.Internal
import Foreign hiding (void)
import Foreign.C
data Membuf
foreign import ccall safe "membuf_init"
c_membuf_init
:: Ptr Membuf
-> IO ()
foreign import ccall safe "membuf_free"
c_membuf_free
:: Ptr Membuf
-> IO ()
withMembuf :: (Ptr Membuf -> IO a) -> IO a
{-# INLINE withMembuf #-}
withMembuf action = do
allocaBytesAligned
16
{-# LINE 35 "src/Exomizer/Extern/Membuf.chs" #-}
8
{-# LINE 36 "src/Exomizer/Extern/Membuf.chs" #-}
$ \membufPtr -> do
c_membuf_init membufPtr
result <- action membufPtr
c_membuf_free membufPtr
return result
foreign import ccall safe "membuf_append"
c_membuf_append
:: Ptr Membuf
-> Ptr CChar
-> CInt
-> IO (Ptr CChar)
membufAppend :: Ptr Membuf -> ByteString -> IO ()
{-# INLINE membufAppend #-}
membufAppend membufPtr (PS fp o l) =
withForeignPtr fp $ \p ->
void $ c_membuf_append membufPtr (p `plusPtr` o) (fromIntegral l)
membufGet :: Ptr Membuf -> IO ByteString
{-# INLINE membufGet #-}
membufGet membufPtr = do
p <- (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO (C2HSImp.Ptr ())}) membufPtr
l <- (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CInt}) membufPtr
packCStringLen (castPtr p, fromIntegral l)