module Data.Time.Git (approxidate, io_approxidate, posixToUTC) where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Data.Time
import Data.Time.Clock.POSIX
import qualified Data.ByteString as BS
import qualified Data.ByteString.UTF8 as BS (fromString)
foreign import ccall unsafe "date.c approxidate_careful"
c_approxidate_careful ::
CString -> Ptr CInt ->
IO CULong
approxidate :: String -> Maybe Integer
approxidate = unsafePerformIO . io_approxidate
posixToUTC :: Integer -> UTCTime
posixToUTC = posixSecondsToUTCTime . realToFrac
io_approxidate :: String -> IO (Maybe Integer)
io_approxidate input =
BS.useAsCString (BS.fromString input) (\c_input ->
alloca (\c_error_ret -> do
poke c_error_ret 0
time <- c_approxidate_careful c_input c_error_ret
err <- peek c_error_ret
if err == 0 then return $ Just (toInteger time) else
return Nothing
)
)