module Data.Digest.CRC32C(
    crc32c
  , crc32c_update
  ) where

import           Data.ByteString.Internal    (ByteString (..))
import           Data.Digest.CRC32C.Internal
import           Data.Word
import           Foreign.C.Types
import           Foreign.ForeignPtr.Unsafe
import           Foreign.Ptr

crc32c :: ByteString -> Word32
crc32c :: ByteString -> Word32
crc32c (PS ForeignPtr Word8
p Int
o Int
l) = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Ptr CUChar -> CULong -> CUInt
lib_crc32c_value (forall a. ForeignPtr a -> Ptr a
unsafeForeignPtrToPtr ForeignPtr Word8
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
o) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
l)

crc32c_update :: Word32 -> ByteString -> Word32
crc32c_update :: Word32 -> ByteString -> Word32
crc32c_update Word32
hash (PS ForeignPtr Word8
p Int
o Int
l) = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ CUInt -> Ptr CUChar -> CULong -> CUInt
lib_crc32c_extend (Word32 -> CUInt
CUInt Word32
hash) (forall a. ForeignPtr a -> Ptr a
unsafeForeignPtrToPtr ForeignPtr Word8
p forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
o) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
l)