{-# LINE 1 "src/System/Posix/Types/Iovec.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
module System.Posix.Types.Iovec
(
CIovec(..)
, unsafeByteString2CIovec
, touchByteString
, unsafeUseAsCIovec
, useAsCIovec
) where
import Data.Word (Word8)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BSI
import Foreign.Ptr (Ptr)
import qualified Foreign.Ptr as FFI (castPtr, plusPtr)
import qualified Foreign.ForeignPtr as FFP
import qualified GHC.ForeignPtr as GHC_FFP
import Foreign.C.Types (CSize)
import Foreign.Storable (Storable(..))
data CIovec = CIovec
{ CIovec -> Ptr Word8
iov_base :: {-# UNPACK #-} !(Ptr Word8)
, CIovec -> CSize
iov_len :: {-# UNPACK #-} !CSize
}
{-# LINE 62 "src/System/Posix/Types/Iovec.hsc" #-}
instance Storable CIovec where
alignment :: CIovec -> Int
alignment CIovec
_ = Int
8
{-# LINE 65 "src/System/Posix/Types/Iovec.hsc" #-}
sizeOf :: CIovec -> Int
sizeOf CIovec
_ = (Int
16)
{-# LINE 67 "src/System/Posix/Types/Iovec.hsc" #-}
peek :: Ptr CIovec -> IO CIovec
peek Ptr CIovec
ptr = do
Ptr Word8
base <- (\Ptr CIovec
hsc_ptr -> Ptr CIovec -> Int -> IO (Ptr Word8)
forall b. Ptr b -> Int -> IO (Ptr Word8)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CIovec
hsc_ptr Int
0) Ptr CIovec
ptr
{-# LINE 70 "src/System/Posix/Types/Iovec.hsc" #-}
CSize
len <- (\Ptr CIovec
hsc_ptr -> Ptr CIovec -> Int -> IO CSize
forall b. Ptr b -> Int -> IO CSize
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CIovec
hsc_ptr Int
8) Ptr CIovec
ptr
{-# LINE 71 "src/System/Posix/Types/Iovec.hsc" #-}
CIovec -> IO CIovec
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr Word8 -> CSize -> CIovec
CIovec Ptr Word8
base CSize
len)
poke :: Ptr CIovec -> CIovec -> IO ()
poke Ptr CIovec
ptr (CIovec Ptr Word8
base CSize
len) = do
(\Ptr CIovec
hsc_ptr -> Ptr CIovec -> Int -> Ptr Word8 -> IO ()
forall b. Ptr b -> Int -> Ptr Word8 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CIovec
hsc_ptr Int
0) Ptr CIovec
ptr Ptr Word8
base
{-# LINE 75 "src/System/Posix/Types/Iovec.hsc" #-}
(\Ptr CIovec
hsc_ptr -> Ptr CIovec -> Int -> CSize -> IO ()
forall b. Ptr b -> Int -> CSize -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CIovec
hsc_ptr Int
8) Ptr CIovec
ptr CSize
len
{-# LINE 76 "src/System/Posix/Types/Iovec.hsc" #-}
unsafeByteString2CIovec :: BS.ByteString -> CIovec
unsafeByteString2CIovec :: ByteString -> CIovec
unsafeByteString2CIovec (BSI.PS ForeignPtr Word8
fptr Int
offset Int
len) =
Ptr Word8 -> CSize -> CIovec
CIovec
(ForeignPtr Word8 -> Ptr Word8
forall a. ForeignPtr a -> Ptr a
GHC_FFP.unsafeForeignPtrToPtr ForeignPtr Word8
fptr Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`FFI.plusPtr` Int
offset)
(Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len)
{-# INLINE unsafeByteString2CIovec #-}
touchByteString :: BS.ByteString -> IO ()
touchByteString :: ByteString -> IO ()
touchByteString (BSI.PS ForeignPtr Word8
fptr Int
_ Int
_) = ForeignPtr Word8 -> IO ()
forall a. ForeignPtr a -> IO ()
FFP.touchForeignPtr ForeignPtr Word8
fptr
{-# INLINE touchByteString #-}
unsafeUseAsCIovec :: BS.ByteString -> (CIovec -> IO a) -> IO a
unsafeUseAsCIovec :: forall a. ByteString -> (CIovec -> IO a) -> IO a
unsafeUseAsCIovec (BSI.PS ForeignPtr Word8
fptr Int
offset Int
len) CIovec -> IO a
io =
ForeignPtr Word8 -> (Ptr Word8 -> IO a) -> IO a
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
FFP.withForeignPtr ForeignPtr Word8
fptr ((Ptr Word8 -> IO a) -> IO a) -> (Ptr Word8 -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
ptr ->
CIovec -> IO a
io (Ptr Word8 -> CSize -> CIovec
CIovec (Ptr Word8
ptr Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`FFI.plusPtr` Int
offset) (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len))
{-# INLINE unsafeUseAsCIovec #-}
useAsCIovec :: BS.ByteString -> (CIovec -> IO a) -> IO a
useAsCIovec :: forall a. ByteString -> (CIovec -> IO a) -> IO a
useAsCIovec s :: ByteString
s@(BSI.PS ForeignPtr Word8
_ Int
_ Int
len) CIovec -> IO a
io =
ByteString -> (CString -> IO a) -> IO a
forall a. ByteString -> (CString -> IO a) -> IO a
BS.useAsCString ByteString
s ((CString -> IO a) -> IO a) -> (CString -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \CString
cstr ->
CIovec -> IO a
io (Ptr Word8 -> CSize -> CIovec
CIovec (CString -> Ptr Word8
forall a b. Ptr a -> Ptr b
FFI.castPtr CString
cstr) (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len))
{-# INLINE useAsCIovec #-}