module Language.Asm.Inline.Util where

import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BS
import Foreign.ForeignPtr
import Foreign.ForeignPtr.Unsafe
import Foreign.Ptr
import GHC.Word

getBSAddr :: BS.ByteString -> Ptr Word8
getBSAddr :: ByteString -> Ptr Word8
getBSAddr ByteString
bs = ForeignPtr Word8 -> Ptr Word8
forall a. ForeignPtr a -> Ptr a
unsafeForeignPtrToPtr ForeignPtr Word8
ptr Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
offset
  where
    (ForeignPtr Word8
ptr, Int
offset, Int
_) = ByteString -> (ForeignPtr Word8, Int, Int)
BS.toForeignPtr ByteString
bs

withBS :: BS.ByteString -> IO a -> IO a
withBS :: ByteString -> IO a -> IO a
withBS ByteString
str IO a
action = ForeignPtr Word8 -> (Ptr Word8 -> IO a) -> IO a
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Word8
ptr ((Ptr Word8 -> IO a) -> IO a) -> (Ptr Word8 -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ IO a -> Ptr Word8 -> IO a
forall a b. a -> b -> a
const IO a
action
  where
    (ForeignPtr Word8
ptr, Int
_, Int
_) = ByteString -> (ForeignPtr Word8, Int, Int)
BS.toForeignPtr ByteString
str