[project @ 1996-01-11 14:06:51 by partain]
[ghc-hetmet.git] / ghc / runtime / io / toUTCTime.lc
index 1442993..e755559 100644 (file)
 #include "timezone.h"
 
 StgAddr 
-toUTCTime(size, d)
+toUTCTime(size, d, res)
 StgInt size;
 StgByteArray d;
+StgByteArray res;
 {
     time_t t;
-    struct tm *tm;
-    static struct tm cache_tm;
+    struct tm *tm,*tmp=(struct tm *)res;
 
     switch(size) {
        default:
@@ -40,8 +40,32 @@ StgByteArray d;
     if (tm == NULL)
        return NULL;
 
-    cache_tm = *tm;
-    return &cache_tm;
+    /*
+      gmtime() may return a ptr to statically allocated storage,
+      so to make toUTCTime reentrant, we manually copy
+      the structure into the (struct tm *) passed in.
+    */
+    tmp->tm_sec    = tm->tm_sec;
+    tmp->tm_min    = tm->tm_min;
+    tmp->tm_hour   = tm->tm_hour;
+    tmp->tm_mday   = tm->tm_mday;
+    tmp->tm_mon    = tm->tm_mon;
+    tmp->tm_year   = tm->tm_year;
+    tmp->tm_wday   = tm->tm_wday;
+    tmp->tm_yday   = tm->tm_yday;
+    tmp->tm_isdst  = tm->tm_isdst;
+    /*
+      If you don't have tm_zone in (struct tm), but
+      you get at it via the shared tmzone[], you'll
+      lose. Same goes for the tm_gmtoff field.
+    
+    */
+#if HAVE_TM_ZONE
+    strcpy(tmp->tm_zone,tm->tm_zone);
+    tmp->tm_gmtoff = tm->tm_gmtoff;
+#endif
+
+    return (StgAddr)res;
 }
 
 \end{code}