{-# 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
32)
{-# 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
8) 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
16) 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
24) 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 ()