content: {-# 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 p ex bin err c =
    bracket (wrapRawPWriteStreamCallback c) freeHaskellFunPtr (withFileRawPWriteStream' p ex bin err)
  
  foreign import ccall safe "LLVM_Hs_WithBufferRawPWriteStream" withBufferRawPWriteStream' ::
    FunPtr ByteRangeCallback -> FunPtr RawPWriteStreamCallback -> IO ()
  
  withBufferRawPWriteStream :: ByteRangeCallback -> RawPWriteStreamCallback -> IO ()
  withBufferRawPWriteStream oc c =
    bracket (wrapRawPWriteStreamCallback c) freeHaskellFunPtr $ \c ->
    bracket (wrapByteRangeCallback oc) freeHaskellFunPtr $ \oc ->
      withBufferRawPWriteStream' oc c
  