{-# LANGUAGE
  ForeignFunctionInterface
  #-}
module LLVM.Internal.FFI.RawOStream where

import LLVM.Prelude

import Foreign.Ptr
import Foreign.C
import Control.Exception (bracket)

import LLVM.Internal.FFI.ByteRangeCallback
import LLVM.Internal.FFI.LLVMCTypes
import LLVM.Internal.FFI.PtrHierarchy

type RawPWriteStreamCallback = Ptr RawPWriteStream -> IO ()

foreign import ccall "wrapper" wrapRawPWriteStreamCallback ::
  RawPWriteStreamCallback -> IO (FunPtr RawPWriteStreamCallback)

foreign import ccall safe "LLVM_Hs_WithFileRawPWriteStream" withFileRawPWriteStream' ::
  CString -> LLVMBool -> LLVMBool -> Ptr (OwnerTransfered CString) -> FunPtr RawPWriteStreamCallback -> IO LLVMBool

withFileRawPWriteStream :: CString -> LLVMBool -> LLVMBool -> Ptr (OwnerTransfered CString) -> RawPWriteStreamCallback -> IO LLVMBool
withFileRawPWriteStream :: CString
-> LLVMBool
-> LLVMBool
-> Ptr (OwnerTransfered CString)
-> RawPWriteStreamCallback
-> IO LLVMBool
withFileRawPWriteStream p :: CString
p ex :: LLVMBool
ex bin :: LLVMBool
bin err :: Ptr (OwnerTransfered CString)
err c :: RawPWriteStreamCallback
c =
  IO (FunPtr RawPWriteStreamCallback)
-> (FunPtr RawPWriteStreamCallback -> IO ())
-> (FunPtr RawPWriteStreamCallback -> IO LLVMBool)
-> IO LLVMBool
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (RawPWriteStreamCallback -> IO (FunPtr RawPWriteStreamCallback)
wrapRawPWriteStreamCallback RawPWriteStreamCallback
c) FunPtr RawPWriteStreamCallback -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr (CString
-> LLVMBool
-> LLVMBool
-> Ptr (OwnerTransfered CString)
-> FunPtr RawPWriteStreamCallback
-> IO LLVMBool
withFileRawPWriteStream' CString
p LLVMBool
ex LLVMBool
bin Ptr (OwnerTransfered CString)
err)

foreign import ccall safe "LLVM_Hs_WithBufferRawPWriteStream" withBufferRawPWriteStream' ::
  FunPtr ByteRangeCallback -> FunPtr RawPWriteStreamCallback -> IO ()

withBufferRawPWriteStream :: ByteRangeCallback -> RawPWriteStreamCallback -> IO ()
withBufferRawPWriteStream :: ByteRangeCallback -> RawPWriteStreamCallback -> IO ()
withBufferRawPWriteStream oc :: ByteRangeCallback
oc c :: RawPWriteStreamCallback
c =
  IO (FunPtr RawPWriteStreamCallback)
-> (FunPtr RawPWriteStreamCallback -> IO ())
-> (FunPtr RawPWriteStreamCallback -> IO ())
-> IO ()
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (RawPWriteStreamCallback -> IO (FunPtr RawPWriteStreamCallback)
wrapRawPWriteStreamCallback RawPWriteStreamCallback
c) FunPtr RawPWriteStreamCallback -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr ((FunPtr RawPWriteStreamCallback -> IO ()) -> IO ())
-> (FunPtr RawPWriteStreamCallback -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \c :: FunPtr RawPWriteStreamCallback
c ->
  IO (FunPtr ByteRangeCallback)
-> (FunPtr ByteRangeCallback -> IO ())
-> (FunPtr ByteRangeCallback -> IO ())
-> IO ()
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (ByteRangeCallback -> IO (FunPtr ByteRangeCallback)
wrapByteRangeCallback ByteRangeCallback
oc) FunPtr ByteRangeCallback -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr ((FunPtr ByteRangeCallback -> IO ()) -> IO ())
-> (FunPtr ByteRangeCallback -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \oc :: FunPtr ByteRangeCallback
oc ->
    FunPtr ByteRangeCallback -> FunPtr RawPWriteStreamCallback -> IO ()
withBufferRawPWriteStream' FunPtr ByteRangeCallback
oc FunPtr RawPWriteStreamCallback
c