module LLVM.Internal.RawOStream where
import LLVM.Prelude
import Control.Monad.AnyCont
import Control.Monad.Catch
import Control.Monad.IO.Class
import Data.IORef
import Foreign.C
import Foreign.Ptr
import LLVM.Exception
import qualified LLVM.Internal.FFI.RawOStream as FFI
import qualified LLVM.Internal.FFI.PtrHierarchy as FFI
import LLVM.Internal.Coding
import LLVM.Internal.String ()
withFileRawOStream ::
(MonadThrow m, MonadIO m, MonadAnyCont IO m)
=> String
-> Bool
-> Bool
-> (Ptr FFI.RawOStream -> IO ())
-> m ()
withFileRawOStream :: forall (m :: * -> *).
(MonadThrow m, MonadIO m, MonadAnyCont IO m) =>
String -> Bool -> Bool -> (Ptr RawOStream -> IO ()) -> m ()
withFileRawOStream String
path Bool
excl Bool
text Ptr RawOStream -> IO ()
c =
String -> Bool -> Bool -> (Ptr RawPWriteStream -> IO ()) -> m ()
forall (m :: * -> *).
(MonadThrow m, MonadIO m, MonadAnyCont IO m) =>
String -> Bool -> Bool -> (Ptr RawPWriteStream -> IO ()) -> m ()
withFileRawPWriteStream String
path Bool
excl Bool
text (Ptr RawOStream -> IO ()
c (Ptr RawOStream -> IO ())
-> (Ptr RawPWriteStream -> Ptr RawOStream)
-> Ptr RawPWriteStream
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr RawPWriteStream -> Ptr RawOStream
forall a b. DescendentOf a b => Ptr b -> Ptr a
FFI.upCast)
withFileRawPWriteStream ::
(MonadThrow m, MonadIO m, MonadAnyCont IO m)
=> String
-> Bool
-> Bool
-> (Ptr FFI.RawPWriteStream -> IO ())
-> m ()
withFileRawPWriteStream :: forall (m :: * -> *).
(MonadThrow m, MonadIO m, MonadAnyCont IO m) =>
String -> Bool -> Bool -> (Ptr RawPWriteStream -> IO ()) -> m ()
withFileRawPWriteStream String
path Bool
excl Bool
text Ptr RawPWriteStream -> IO ()
c = do
CString
path <- String -> m CString
forall (e :: * -> *) h c. (EncodeM e h c, HasCallStack) => h -> e c
encodeM String
path
LLVMBool
excl <- Bool -> m LLVMBool
forall (e :: * -> *) h c. (EncodeM e h c, HasCallStack) => h -> e c
encodeM Bool
excl
LLVMBool
text <- Bool -> m LLVMBool
forall (e :: * -> *) h c. (EncodeM e h c, HasCallStack) => h -> e c
encodeM Bool
text
Ptr (OwnerTransfered CString)
msgPtr <- m (Ptr (OwnerTransfered CString))
forall a (m :: * -> *).
(Storable a, MonadAnyCont IO m) =>
m (Ptr a)
alloca
Bool
succeeded <- LLVMBool -> m Bool
forall (d :: * -> *) h c. (DecodeM d h c, HasCallStack) => c -> d h
decodeM (LLVMBool -> m Bool) -> m LLVMBool -> m Bool
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (IO LLVMBool -> m LLVMBool
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO LLVMBool -> m LLVMBool) -> IO LLVMBool -> m LLVMBool
forall a b. (a -> b) -> a -> b
$ CString
-> LLVMBool
-> LLVMBool
-> Ptr (OwnerTransfered CString)
-> (Ptr RawPWriteStream -> IO ())
-> IO LLVMBool
FFI.withFileRawPWriteStream CString
path LLVMBool
excl LLVMBool
text Ptr (OwnerTransfered CString)
msgPtr Ptr RawPWriteStream -> IO ()
c)
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
succeeded (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
String
s <- Ptr (OwnerTransfered CString) -> m String
forall (d :: * -> *) h c. (DecodeM d h c, HasCallStack) => c -> d h
decodeM Ptr (OwnerTransfered CString)
msgPtr
FdStreamException -> m ()
forall e a. Exception e => e -> m a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (FdStreamException -> m ()) -> FdStreamException -> m ()
forall a b. (a -> b) -> a -> b
$ String -> FdStreamException
FdStreamException String
s
withBufferRawOStream ::
(MonadIO m, DecodeM IO a (Ptr CChar, CSize))
=> (Ptr FFI.RawOStream -> IO ())
-> m a
withBufferRawOStream :: forall (m :: * -> *) a.
(MonadIO m, DecodeM IO a (CString, CSize)) =>
(Ptr RawOStream -> IO ()) -> m a
withBufferRawOStream Ptr RawOStream -> IO ()
c = (Ptr RawPWriteStream -> IO ()) -> m a
forall (m :: * -> *) a.
(MonadIO m, DecodeM IO a (CString, CSize)) =>
(Ptr RawPWriteStream -> IO ()) -> m a
withBufferRawPWriteStream (Ptr RawOStream -> IO ()
c (Ptr RawOStream -> IO ())
-> (Ptr RawPWriteStream -> Ptr RawOStream)
-> Ptr RawPWriteStream
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr RawPWriteStream -> Ptr RawOStream
forall a b. DescendentOf a b => Ptr b -> Ptr a
FFI.upCast)
withBufferRawPWriteStream ::
(MonadIO m, DecodeM IO a (Ptr CChar, CSize))
=> (Ptr FFI.RawPWriteStream -> IO ())
-> m a
withBufferRawPWriteStream :: forall (m :: * -> *) a.
(MonadIO m, DecodeM IO a (CString, CSize)) =>
(Ptr RawPWriteStream -> IO ()) -> m a
withBufferRawPWriteStream Ptr RawPWriteStream -> IO ()
c = IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> IO a -> m a
forall a b. (a -> b) -> a -> b
$ do
IORef a
resultRef <- a -> IO (IORef a)
forall a. a -> IO (IORef a)
newIORef a
forall a. HasCallStack => a
undefined
let saveBuffer :: Ptr CChar -> CSize -> IO ()
saveBuffer :: CString -> CSize -> IO ()
saveBuffer CString
start CSize
size = do
a
r <- (CString, CSize) -> IO a
forall (d :: * -> *) h c. (DecodeM d h c, HasCallStack) => c -> d h
decodeM (CString
start, CSize
size)
IORef a -> a -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef a
resultRef a
r
(CString -> CSize -> IO ())
-> (Ptr RawPWriteStream -> IO ()) -> IO ()
FFI.withBufferRawPWriteStream CString -> CSize -> IO ()
saveBuffer Ptr RawPWriteStream -> IO ()
c
IORef a -> IO a
forall a. IORef a -> IO a
readIORef IORef a
resultRef