[project @ 2001-01-12 15:48:56 by simonmar]
[ghc-hetmet.git] / ghc / lib / std / cbits / timezone.h
index 46b907f..f84c241 100644 (file)
@@ -1,8 +1,52 @@
+/* 
+ * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
+ *
+ * $Id: timezone.h,v 1.10 2000/07/17 15:27:15 rrt Exp $
+ *
+ * Time-zone support header
+ */
+
 #ifndef TIMEZONE_H
 #define TIMEZONE_H
 
 #define _OSF_SOURCE
 
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if linux_TARGET_OS
+/* Sigh, RedHat 5 has the TM_ZONE stuff, but only when _BSD_SOURCE is
+ * on.  The configure script erroneously says we've got TM_ZONE, so
+ * make sure we use the TZNAME stuff instead.
+ *
+ * Aside: tzname is POSIX, whereas tm_zone is BSD.  We should be using
+ *  tzname by preference, but the GNU configure stuff gives us HAVE_TM_ZONE
+ *  in preference to HAVE_TZNAME.  More sighs.
+ */
+# undef  HAVE_TM_ZONE
+# define HAVE_TZNAME  1
+
+/* Double sigh.  The timezone variable is only available under Linux
+ * when we're compiling NON_POSIX_SOURCE (or _GNU_SOURCE or whatever),
+ * but to make that work we have to make sure NON_POSIX_SOURCE is
+ * defined before anything from /usr/include is included.  To avoid
+ * infecting too much source with NON_POSIX_SOURCE, we frob it
+ * below...
+ */
+#undef HAVE_TIMEZONE
+
+/* The correct solution to this problem would appear to be to ditch
+ * the standard GNU configure tests for the time stuff, and hack up
+ * our own that test for POSIX-compliant time support first, then
+ * BSD-style time stuff.
+ */
+#endif
+
+#ifdef solaris2_TARGET_OS
+#undef HAVE_TIMEZONE
+#endif
+
 #if TIME_WITH_SYS_TIME
 # include <sys/time.h>
 # include <time.h>
 #define SETZONE(x,z)     (((struct tm *)x)->tm_zone = z)
 #define GMTOFF(x)        (((struct tm *)x)->tm_gmtoff)
 #else /* ! HAVE_TM_ZONE */
-# if HAVE_TZNAME || cygwin32_TARGET_OS
-#if cygwin32_TARGET_OS
-extern char *tzname;
-#else
+# if HAVE_TZNAME || _WIN32
+#  if cygwin32_TARGET_OS
+#   define tzname _tzname
+#  endif
+#  ifndef mingw32_TARGET_OS
 extern char *tzname[2];
-#endif
+#  endif
+
 #  define ZONE(x)       (((struct tm *)x)->tm_isdst ? tzname[1] : tzname[0])
 #  define SETZONE(x,z)
 # else /* ! HAVE_TZNAME */
@@ -33,14 +79,20 @@ extern char *tzname[2];
 # endif /* ! HAVE_TZNAME */
 /* Get the offset in secs from UTC, if (struct tm) doesn't supply it. */
 
+#if defined(mingw32_TARGET_OS) || defined(cygwin32_TARGET_OS)
+#define timezone _timezone
+#endif
+
+#if !defined(HAVE_TIMEZONE) && !defined(mingw32_TARGET_OS)
 extern TYPE_TIMEZONE timezone;
+#endif
 
 # if HAVE_ALTZONE
 extern time_t altzone;
-#  define GMTOFF(x)     (((struct tm *)x)->tm_isdst ? altzone : timezone)
+#  define GMTOFF(x)     (((struct tm *)x)->tm_isdst ? altzone : timezone )
 # else /* ! HAVE_ALTZONE */
 /* Assume that DST offset is 1 hour ... */
-#  define GMTOFF(x) (((struct tm *)x)->tm_isdst ? (timezone - 3600) : timezone)
+#  define GMTOFF(x) (((struct tm *)x)->tm_isdst ? (timezone - 3600) : timezone )
 # endif /* ! HAVE_ALTZONE */
 #endif  /* ! HAVE_TM_ZONE */