{-# LINE 1 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
{-# Language ForeignFunctionInterface #-}
{-# LINE 2 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
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


{-# LINE 17 "src/Text/Sundown/Buffer/Foreign.hsc" #-}

data Buffer = Buffer
    { buf_data  :: CString
    , buf_size  :: CSize
    , buf_asize :: CSize
    , buf_unit  :: CSize
    }

instance Storable Buffer where
    sizeOf _    = (32)
{-# LINE 27 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    alignment _ = alignment (undefined :: CInt)
    peek ptr    = Buffer <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 29 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 30 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 31 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
                         <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 32 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    poke _ _    = error "Buffer.poke not implemented."

getBufferData :: Buffer -> IO ByteString
getBufferData Buffer {buf_data = d, buf_size = s}
    | d == nullPtr = return $ BS.pack [0]
    | otherwise    = BS.packCStringLen (d, fromIntegral s)

foreign import ccall "buffer.h bufnew"
    bufnew :: CSize -> IO (Ptr Buffer)

foreign import ccall "buffer.h bufrelease"
    bufrelease :: Ptr Buffer -> IO ()