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
{ buf_data :: CString
, buf_size :: CSize
, buf_asize :: CSize
, buf_unit :: CSize
}
instance Storable Buffer where
sizeOf _ = (32)
alignment _ = alignment (undefined :: CInt)
peek ptr = Buffer <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
<*> (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
<*> (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
<*> (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
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 ()