-- GENERATED by C->Haskell Compiler, version 0.28.1 Switcheroo, 1 April 2016 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Exomizer/Extern/Membuf.chs" #-}
-- | Interface to membuf.c
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



-- | @since 1.0.0
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 ()

-- | @since 1.0.0
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)

-- | @since 1.0.0
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)

-- | @since 1.0.0
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)