{-# LINE 1 "src/Text/Sundown/Buffer/Foreign.hsc" #-} {-# Language ForeignFunctionInterface #-} module Text.Sundown.Buffer.Foreign ( Buffer (..) , getBufferData , bufnew , bufrelease ) where import Control.Applicative import Data.ByteString (ByteString) import qualified Data.ByteString as BS import Foreign import Foreign.C.String import Foreign.C.Types data Buffer = Buffer { Buffer -> CString buf_data :: CString , Buffer -> CSize buf_size :: CSize , Buffer -> CSize buf_asize :: CSize , Buffer -> CSize buf_unit :: CSize } instance Storable Buffer where sizeOf :: Buffer -> Int sizeOf Buffer _ = (Int 16) {-# LINE 27 "src/Text/Sundown/Buffer/Foreign.hsc" #-} alignment _ = alignment (undefined :: CInt) peek :: Ptr Buffer -> IO Buffer peek Ptr Buffer ptr = CString -> CSize -> CSize -> CSize -> Buffer Buffer (CString -> CSize -> CSize -> CSize -> Buffer) -> IO CString -> IO (CSize -> CSize -> CSize -> Buffer) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (\Ptr Buffer hsc_ptr -> Ptr Buffer -> Int -> IO CString forall a b. Storable a => Ptr b -> Int -> IO a peekByteOff Ptr Buffer hsc_ptr Int 0) Ptr Buffer ptr {-# LINE 29 "src/Text/Sundown/Buffer/Foreign.hsc" #-} IO (CSize -> CSize -> CSize -> Buffer) -> IO CSize -> IO (CSize -> CSize -> Buffer) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> (\Ptr Buffer hsc_ptr -> Ptr Buffer -> Int -> IO CSize forall a b. Storable a => Ptr b -> Int -> IO a peekByteOff Ptr Buffer hsc_ptr Int 4) Ptr Buffer ptr {-# LINE 30 "src/Text/Sundown/Buffer/Foreign.hsc" #-} IO (CSize -> CSize -> Buffer) -> IO CSize -> IO (CSize -> Buffer) forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> (\Ptr Buffer hsc_ptr -> Ptr Buffer -> Int -> IO CSize forall a b. Storable a => Ptr b -> Int -> IO a peekByteOff Ptr Buffer hsc_ptr Int 8) Ptr Buffer ptr {-# LINE 31 "src/Text/Sundown/Buffer/Foreign.hsc" #-} IO (CSize -> Buffer) -> IO CSize -> IO Buffer forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> (\Ptr Buffer hsc_ptr -> Ptr Buffer -> Int -> IO CSize forall a b. Storable a => Ptr b -> Int -> IO a peekByteOff Ptr Buffer hsc_ptr Int 12) Ptr Buffer ptr {-# LINE 32 "src/Text/Sundown/Buffer/Foreign.hsc" #-} poke _ _ = error "Buffer.poke not implemented." getBufferData :: Buffer -> IO ByteString getBufferData :: Buffer -> IO ByteString getBufferData Buffer {buf_data :: Buffer -> CString buf_data = CString d, buf_size :: Buffer -> CSize buf_size = CSize s} | CString d CString -> CString -> Bool forall a. Eq a => a -> a -> Bool == CString forall a. Ptr a nullPtr = ByteString -> IO ByteString forall (m :: * -> *) a. Monad m => a -> m a return (ByteString -> IO ByteString) -> ByteString -> IO ByteString forall a b. (a -> b) -> a -> b $ [Word8] -> ByteString BS.pack [Word8 0] | Bool otherwise = CStringLen -> IO ByteString BS.packCStringLen (CString d, CSize -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral CSize s) foreign import ccall "buffer.h bufnew" bufnew :: CSize -> IO (Ptr Buffer) foreign import ccall "buffer.h bufrelease" bufrelease :: Ptr Buffer -> IO ()