{-# LINE 1 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
{-# Language ForeignFunctionInterface #-}
{-# LINE 2 "src/Text/Sundown/Buffer/Foreign.hsc" #-}

module Text.Sundown.Buffer.Foreign
       ( Buffer (..)
       , c_bufnew
       , c_bufputs
       , c_bufgrow
       , c_bufrelease
       ) where

import Foreign
import Foreign.C.Types
import Foreign.C.String
import Data.ByteString         (ByteString)
import qualified Data.ByteString as BS


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

data Buffer = Buffer { bufData  :: ByteString
                     , bufSize  :: Int
                     , bufASize :: Int
                     , bufUnit  :: Int
                     , bufRef   :: Int
                     }

instance Storable Buffer where
  sizeOf _ = ((20))
{-# LINE 28 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
  alignment _ = alignment (undefined :: CInt)
  peek ptr = do
    d  <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 31 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    dbs <- if d == nullPtr
           then return $ BS.pack [0]
           else BS.packCString d
    s  <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
{-# LINE 35 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    as <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 36 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    u  <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) ptr
{-# LINE 37 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    r  <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 38 "src/Text/Sundown/Buffer/Foreign.hsc" #-}
    return $ Buffer dbs s as u r
  poke _ _ = error "Buffer.poke not implemented."

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

c_bufputs :: Ptr Buffer -> ByteString -> IO ()
c_bufputs buf bs = BS.useAsCString bs $ c_bufputs' buf
foreign import ccall "buffer.h bufputs"
  c_bufputs' :: Ptr Buffer -> CString -> IO ()

foreign import ccall "buffer.h bufgrow"
  c_bufgrow :: Ptr Buffer -> CSize -> IO CInt

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