import Prelude
+import Data.Ratio
+
+#ifdef __HUGS__
+import Hugs.Time ( getCPUTime, clockTicks )
+#endif
+
+#ifdef __GLASGOW_HASKELL__
import Foreign
import Foreign.C
-import Data.Ratio
-
#include "HsBase.h"
+#endif
+#ifdef __GLASGOW_HASKELL__
-- -----------------------------------------------------------------------------
-- |Computation 'getCPUTime' returns the number of picoseconds CPU time
-- used by the current program. The precision of this result is
foreign import ccall unsafe "GetProcessTimes" getProcessTimes :: Ptr HANDLE -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> Ptr FILETIME -> IO CInt
#endif /* not _WIN32 */
+#endif /* __GLASGOW_HASKELL__ */
-- |The 'cpuTimePrecision' constant is the smallest measurable difference
-- in CPU time that the implementation can record, and is given as an
cpuTimePrecision :: Integer
cpuTimePrecision = round ((1000000000000::Integer) % fromIntegral (clockTicks))
+#ifdef __GLASGOW_HASKELL__
clockTicks :: Int
clockTicks =
#if defined(CLK_TCK)
unsafePerformIO (sysconf (#const _SC_CLK_TCK) >>= return . fromIntegral)
foreign import ccall unsafe sysconf :: CInt -> IO CLong
#endif
+#endif /* __GLASGOW_HASKELL__ */
) where
+#ifndef __HUGS__
#include "HsBase.h"
+#endif
import Prelude
import Data.Ix
import System.Locale
import System.IO.Unsafe
-
+
+#ifdef __HUGS__
+import Hugs.Time ( getClockTimePrim, toCalTimePrim, toClockTimePrim )
+#else
import Foreign
import Foreign.C
+#endif
-- One way to partition and give name to chunks of a year and a week:
-- getClockTime returns the current time in its internal representation.
getClockTime :: IO ClockTime
-#if HAVE_GETTIMEOFDAY
+#ifdef __HUGS__
+getClockTime = do
+ (sec,usec) <- getClockTimePrim
+ return (TOD (fromIntegral sec) ((fromIntegral usec) * 1000000))
+
+#elif HAVE_GETTIMEOFDAY
getClockTime = do
allocaBytes (#const sizeof(struct timeval)) $ \ p_timeval -> do
throwErrnoIfMinus1_ "getClockTime" $ gettimeofday p_timeval nullPtr
, tdSec = diffSecs
}
+#ifndef __HUGS__
-- -----------------------------------------------------------------------------
-- How do we deal with timezones on this architecture?
return (- (if dst then (fromIntegral tz - 3600) else tz))
# endif /* ! HAVE_ALTZONE */
#endif /* ! HAVE_TM_ZONE */
+#endif /* ! __HUGS__ */
-- -----------------------------------------------------------------------------
-- toCalendarTime t converts t to a local time, modified by
toCalendarTime :: ClockTime -> IO CalendarTime
-#if HAVE_LOCALTIME_R
+#ifdef __HUGS__
+toCalendarTime = toCalTime False
+#elif HAVE_LOCALTIME_R
toCalendarTime = clockToCalendarTime_reentrant (throwAwayReturnPointer localtime_r) False
#else
toCalendarTime = clockToCalendarTime_static localtime False
#endif
-toUTCTime :: ClockTime -> CalendarTime
-#if HAVE_GMTIME_R
+toUTCTime :: ClockTime -> CalendarTime
+#ifdef __HUGS__
+toUTCTime = unsafePerformIO . toCalTime True
+#elif HAVE_GMTIME_R
toUTCTime = unsafePerformIO . clockToCalendarTime_reentrant (throwAwayReturnPointer gmtime_r) True
#else
toUTCTime = unsafePerformIO . clockToCalendarTime_static gmtime True
#endif
+#ifdef __HUGS__
+toCalTime :: Bool -> ClockTime -> IO CalendarTime
+toCalTime toUTC (TOD s psecs)
+ | (s > fromIntegral (maxBound :: Int)) ||
+ (s < fromIntegral (minBound :: Int))
+ = error ((if toUTC then "toUTCTime: " else "toCalendarTime: ") ++
+ "clock secs out of range")
+ | otherwise = do
+ (sec,min,hour,mday,mon,year,wday,yday,isdst,zone,off) <-
+ toCalTimePrim (if toUTC then 1 else 0) (fromIntegral s)
+ return (CalendarTime{ ctYear=1900+year
+ , ctMonth=toEnum mon
+ , ctDay=mday
+ , ctHour=hour
+ , ctMin=min
+ , ctSec=sec
+ , ctPicosec=psecs
+ , ctWDay=toEnum wday
+ , ctYDay=yday
+ , ctTZName=(if toUTC then "UTC" else zone)
+ , ctTZ=(if toUTC then 0 else off)
+ , ctIsDST=not toUTC && (isdst/=0)
+ })
+#else /* ! __HUGS__ */
throwAwayReturnPointer :: (Ptr CTime -> Ptr CTm -> IO (Ptr CTm))
-> (Ptr CTime -> Ptr CTm -> IO ( ))
throwAwayReturnPointer fun x y = fun x y >> return ()
(if is_utc then "UTC" else tzname)
(if is_utc then 0 else fromIntegral tz)
(if is_utc then False else isdst /= 0))
-
+#endif /* ! __HUGS__ */
toClockTime :: CalendarTime -> ClockTime
+#ifdef __HUGS__
+toClockTime (CalendarTime yr mon mday hour min sec psec
+ _wday _yday _tzname tz isdst) =
+ unsafePerformIO $ do
+ s <- toClockTimePrim (yr-1900) (fromEnum mon) mday
+ hour min sec
+ tz (if isdst then 1 else 0)
+ return (TOD (fromIntegral s) psec)
+#else /* ! __HUGS__ */
toClockTime (CalendarTime year mon mday hour min sec psec
_wday _yday _tzname tz isdst) =
gmtoff <- gmtoff p_tm
let res = fromIntegral t - tz + fromIntegral gmtoff
return (TOD (fromIntegral res) psec)
+#endif /* ! __HUGS__ */
-- -----------------------------------------------------------------------------
-- Converting time values to strings.
addS v s = if abs v == 1 then fst s else snd s
-
+#ifndef __HUGS__
-- -----------------------------------------------------------------------------
-- Foreign time interface (POSIX)
foreign import ccall unsafe ftime :: Ptr CTimeB -> IO ()
#endif
#endif
+#endif /* ! __HUGS__ */