[commit: packages/time] format-widths, improve-leapseconds, master, posix-perf, tasty, wip/travis: add name to Timezone (d028ced)

git at git.haskell.org git at git.haskell.org
Mon Feb 20 21:07:57 UTC 2017


Repository : ssh://git@git.haskell.org/time

On branches: format-widths,improve-leapseconds,master,posix-perf,tasty,wip/travis
Link       : http://git.haskell.org/packages/time.git/commitdiff/d028cedc35e60de0e111a5c4318f0c41c46db52e

>---------------------------------------------------------------

commit d028cedc35e60de0e111a5c4318f0c41c46db52e
Author: Ashley Yakeley <ashley at semantic.org>
Date:   Wed May 4 04:16:42 2005 -0700

    add name to Timezone
    
    darcs-hash:20050504111642-ac6dd-aeb9239e546e584e7f6d027e7b3a70b87ea793f8


>---------------------------------------------------------------

d028cedc35e60de0e111a5c4318f0c41c46db52e
 System/Time/Calendar/Timezone.hs | 24 ++++++++++++++----------
 TestFormat.hs                    | 13 +++++++++----
 TestFormatStuff.c                |  3 ++-
 TestFormatStuff.h                |  2 +-
 timestuff.c                      |  3 ++-
 timestuff.h                      |  2 +-
 6 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/System/Time/Calendar/Timezone.hs b/System/Time/Calendar/Timezone.hs
index 87defcd..ec003dc 100644
--- a/System/Time/Calendar/Timezone.hs
+++ b/System/Time/Calendar/Timezone.hs
@@ -18,12 +18,13 @@ import Foreign.C
 
 -- | count of minutes
 data Timezone = MkTimezone {
+	timezoneMinutes :: Int,
 	timezoneDST :: Bool,
-	timezoneMinutes :: Int
+	timezoneName :: String
 } deriving (Eq,Ord)
 
 minutesToTimezone :: Int -> Timezone
-minutesToTimezone = MkTimezone False
+minutesToTimezone m = MkTimezone m False ""
 
 hoursToTimezone :: Int -> Timezone
 hoursToTimezone i = minutesToTimezone (60 * i)
@@ -32,32 +33,35 @@ showT :: Int -> String
 showT t = (show2 (div t 60)) ++ (show2 (mod t 60))
 
 instance Show Timezone where
-	show (MkTimezone _ t) | t < 0 = '-':(showT (negate t))
-	show (MkTimezone _ t) = '+':(showT t)
+	show (MkTimezone t _ _) | t < 0 = '-':(showT (negate t))
+	show (MkTimezone t _ _) = '+':(showT t)
 
 instance FormatTime Timezone where
 	formatCharacter _ 'z' zone = Just (show zone)
+	formatCharacter _ 'Z' (MkTimezone _ _ name) = Just name
 	formatCharacter _ _ _ = Nothing
 
 -- | The UTC time zone
 utc :: Timezone
-utc = minutesToTimezone 0
+utc = MkTimezone 0 False "UTC"
 
-foreign import ccall unsafe "timestuff.h get_current_timezone_seconds" get_current_timezone_seconds :: CTime -> Ptr CInt -> IO CLong
+foreign import ccall unsafe "timestuff.h get_current_timezone_seconds" get_current_timezone_seconds :: CTime -> Ptr CInt -> Ptr CString -> IO CLong
 
 posixToCTime :: POSIXTime -> CTime
 posixToCTime  = fromInteger . floor
 
 -- | Get the local time-zone for a given time (varying as per summertime adjustments)
 getTimezone :: UTCTime -> IO Timezone
-getTimezone time = with 0 (\pdst -> do
-	secs <- get_current_timezone_seconds (posixToCTime (utcTimeToPOSIXSeconds time)) pdst
+getTimezone time = with 0 (\pdst -> with nullPtr (\pcname -> do
+	secs <- get_current_timezone_seconds (posixToCTime (utcTimeToPOSIXSeconds time)) pdst pcname
 	case secs of
 		0x80000000 -> fail "localtime_r failed"
 		_ -> do
 			dst <- peek pdst
-			return (MkTimezone (dst == 1) (div (fromIntegral secs) 60))
-	)
+			cname <- peek pcname
+			name <- peekCString cname
+			return (MkTimezone (div (fromIntegral secs) 60) (dst == 1) name)
+	))
 
 -- | Get the current time-zone
 getCurrentTimezone :: IO Timezone
diff --git a/TestFormat.hs b/TestFormat.hs
index e3f2728..21a84f7 100644
--- a/TestFormat.hs
+++ b/TestFormat.hs
@@ -16,7 +16,7 @@ import Foreign.C
 	int isdst,int gmtoff,time_t t);
 -}
 
-foreign import ccall unsafe "TestFormatStuff.h format_time" format_time :: CString -> CSize -> CString -> CInt -> CInt -> CTime -> IO CSize
+foreign import ccall unsafe "TestFormatStuff.h format_time" format_time :: CString -> CSize -> CString -> CInt -> CInt -> CString -> CTime -> IO CSize
 
 withBuffer :: Int -> (CString -> IO CSize) -> IO String
 withBuffer n f = withArray (replicate n 0) (\buffer -> do
@@ -25,9 +25,14 @@ withBuffer n f = withArray (replicate n 0) (\buffer -> do
 		)
 
 unixFormatTime :: String -> Timezone -> UTCTime -> IO String
-unixFormatTime fmt zone time = withCString fmt (\pfmt ->
-		withBuffer 100 (\buffer -> format_time buffer 100 pfmt (if timezoneDST zone then 1 else 0) (fromIntegral (timezoneMinutes zone * 60)) (fromInteger (truncate (utcTimeToPOSIXSeconds time))))
-		)
+unixFormatTime fmt zone time = withCString fmt (\pfmt -> withCString (timezoneName zone) (\pzonename ->
+		withBuffer 100 (\buffer -> format_time buffer 100 pfmt
+				(if timezoneDST zone then 1 else 0)
+				(fromIntegral (timezoneMinutes zone * 60))
+				pzonename
+				(fromInteger (truncate (utcTimeToPOSIXSeconds time)))
+			)
+		))
 
 locale :: TimeLocale
 locale = defaultTimeLocale {dateTimeFmt = "%a %b %e %H:%M:%S %Y"}
diff --git a/TestFormatStuff.c b/TestFormatStuff.c
index 8450fb5..8d314ba 100644
--- a/TestFormatStuff.c
+++ b/TestFormatStuff.c
@@ -3,12 +3,13 @@
 size_t format_time (
 	char* buffer, size_t maxsize,
 	const char* format,
-	int isdst,int gmtoff,time_t t)
+	int isdst,int gmtoff,char* zonename,time_t t)
 {
 	t += gmtoff;
 	struct tm tmd;
 	gmtime_r(&t,&tmd);
 	tmd.tm_isdst = isdst;
 	tmd.tm_gmtoff = gmtoff;
+	tmd.tm_zone = zonename;
 	return strftime(buffer,maxsize,format,&tmd);
 }
diff --git a/TestFormatStuff.h b/TestFormatStuff.h
index 5f9e853..f2f7175 100644
--- a/TestFormatStuff.h
+++ b/TestFormatStuff.h
@@ -3,4 +3,4 @@
 size_t format_time (
 	char *s, size_t maxsize,
 	const char *format,
-	int isdst,int gmtoff,time_t t);
+	int isdst,int gmtoff,char* zonename,time_t t);
diff --git a/timestuff.c b/timestuff.c
index 6968a9d..386616e 100644
--- a/timestuff.c
+++ b/timestuff.c
@@ -1,12 +1,13 @@
 #include "timestuff.h"
 
-long int get_current_timezone_seconds (time_t t,int* dst)
+long int get_current_timezone_seconds (time_t t,int* dst,char** name)
 {
 	struct tm tmd;
 	struct tm* ptm = localtime_r(&t,&tmd);
 	if (ptm)
 	{
 		*dst = ptm -> tm_isdst;
+		*name = ptm -> tm_zone;
 		return ptm -> tm_gmtoff;
 	}
 	else return 0x80000000;
diff --git a/timestuff.h b/timestuff.h
index 6eaf614..936cd84 100644
--- a/timestuff.h
+++ b/timestuff.h
@@ -1,3 +1,3 @@
 #include <time.h>
 
-long int get_current_timezone_seconds (time_t,int* dst);
+long int get_current_timezone_seconds (time_t,int* dst,char** name);



More information about the ghc-commits mailing list