module Data.Time.Git (approxidate, io_approxidate, posixToUTC) where
import Foreign hiding (unsafePerformIO)
import Foreign.C.Types
import Foreign.C.String
import System.IO.Unsafe (unsafePerformIO)
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
)
)