]> code.delx.au - gnu-emacs/blobdiff - src/systime.h
Some changes from Michael K. Johnson for Linux.
[gnu-emacs] / src / systime.h
index 9dab2deacfaa09bf170197d4193a5d9aa4057d80..faf5d139956bdc72656313df0695097b9db3bfd3 100644 (file)
@@ -17,34 +17,41 @@ You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-#ifdef NEED_TIME_H
-
-/* _h_BSDTYPES is checked because on ISC unix, socket.h includes
-   both time.h and sys/time.h, and the later file is protected
-   from repeated inclusion.  We just hope that other systems will
-   use this guard either not at all, or similarly.  */
-#ifndef _h_BSDTYPES
+#ifdef TIME_WITH_SYS_TIME
+#include <sys/time.h>
 #include <time.h>
-#endif /* _h_BSDTYPES */
-#else /* ! defined (NEED_TIME_H) */
-#ifdef HAVE_TIMEVAL
+#else
+#ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
-#endif /* ! defined (HAVE_TIMEVAL) */
-#endif /* ! defined (NEED_TIME_H) */
+#else
+#include <time.h>
+#endif
+#endif
+
+/* SVr4 doesn't actually declare this in its #include files.  */
+#ifdef USG5_4
+extern long timezone;
+#endif
+
+#ifdef VMS
+#ifdef VAXC
+#include "vmstime.h"
+#endif
+#endif
 
 \f
 /* EMACS_TIME is the type to use to represent temporal intervals -
    struct timeval on some systems, int on others.  It can be passed as
-   the timeout argument to the select () system call.
+   the timeout argument to the select  system call.
 
    EMACS_SECS (TIME) is an rvalue for the seconds component of TIME.
    EMACS_SET_SECS (TIME, SECONDS) sets that to SECONDS.
 
    EMACS_HAS_USECS is defined iff EMACS_TIME has a usecs component.
-   EMACS_USECS (TIME) is an rvalue for the milliseconds component of TIME.
-       This returns zero if EMACS_TIME doesn't have a milliseconds component.
-   EMACS_SET_USECS (TIME, MILLISECONDS) sets that to MILLISECONDS.
-       This does nothing if EMACS_TIME doesn't have a milliseconds component.
+   EMACS_USECS (TIME) is an rvalue for the microseconds component of TIME.
+       This returns zero if EMACS_TIME doesn't have a microseconds component.
+   EMACS_SET_USECS (TIME, MICROSECONDS) sets that to MICROSECONDS.
+       This does nothing if EMACS_TIME doesn't have a microseconds component.
 
    EMACS_SET_SECS_USECS (TIME, SECS, USECS) sets both components of TIME.
 
@@ -65,11 +72,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #ifdef HAVE_TIMEVAL
 
+#define EMACS_HAS_USECS
+
 #define EMACS_TIME struct timeval
 #define EMACS_SECS(time)                   ((time).tv_sec  + 0)
 #define EMACS_USECS(time)                  ((time).tv_usec + 0)
 #define EMACS_SET_SECS(time, seconds)      ((time).tv_sec  = (seconds))
-#define EMACS_SET_USECS(time, milliseconds) ((time).tv_usec = (milliseconds))
+#define EMACS_SET_USECS(time, microseconds) ((time).tv_usec = (microseconds))
 
 #define EMACS_GET_TIME(time)                                   \
 {                                                              \
@@ -145,7 +154,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
    expands to a statement which stores information about the current
    time zone in its arguments.
 
-   *OFFSET is set to the number of minutes west of Greenwich at which
+   *OFFSET is set to the number of minutes EAST of Greenwich at which
    the site's time zone is located.  This should describe the offset
    to standard time only; if some sort of daylight savings time is in
    effect, that should not affect this value.  Note that the tm_gmtoff
@@ -176,24 +185,31 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #ifndef EMACS_CURRENT_TIME_ZONE
 
+/* System V derivatives have a timezone global variable.  */
+#if defined(USG) || defined(VMS)
+#define EMACS_GET_TZ_OFFSET(offset)                                    \
+  do {                                                                 \
+    tzset ();                                                          \
+    *(offset) = timezone;                                              \
+  } while (0)
+#endif
+
 /* If we have timeval, then we have gettimeofday; that's half the battle.  */
-#ifdef HAVE_TIMEVAL
-#define EMACS_GET_TZ_OFFSET_AND_SAVINGS(offset, savings_flag)          \
+#if defined (HAVE_TIMEVAL) && !defined (EMACS_GET_TZ_OFFSET)
+#define EMACS_GET_TZ_OFFSET(offset)                                    \
   do {                                                                 \
     struct timeval dummy;                                              \
     struct timezone zoneinfo;                                          \
                                                                        \
     gettimeofday (&dummy, &zoneinfo);                                  \
-    *(offset) = zoneinfo.tz_minuteswest;                               \
-    *(savings_flag) = zoneinfo.tz_dsttime;                             \
+    *(offset) = -zoneinfo.tz_minuteswest;                              \
   } while (0)
 #endif /* ! defined (HAVE_TIMEVAL) */
 
-
-/* The following sane systems have a tzname array.  The timezone() function
+/* The following sane systems have a tzname array.  The timezone function
    is a stupid idea; timezone names can only be determined geographically,
    not by Greenwich offset.  */
-#if defined (ultrix) || defined (hpux) || defined (_AIX)
+#if defined (ultrix) || defined (hpux) || defined (_AIX) || defined (USG) || defined(VMS)
 
 #define EMACS_GET_TZ_NAMES(standard, savings)                          \
   do {                                                                 \
@@ -204,8 +220,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #else /* ! defined (ultrix) || defined (hpux) || defined (_AIX) */
 /* If we are running SunOS, Mt. Xinu BSD, or MACH 2.5, these systems have a
-   timezone() function.  */
-#if (defined (hp9000) && ! defined (hpux) && defined (unix)) || defined (MACH) || defined (sun)
+   timezone function.  */
+#if (defined (hp9000) && ! defined (hpux) && defined (unix)) || defined (MACH) || defined (sun) || defined (NeXT)
 
 #define EMACS_GET_TZ_NAMES(standard, savings)                          \
   do {                                                                 \
@@ -222,14 +238,22 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #endif /* ! defined (ultrix) || defined (hpux) || defined (_AIX) */
 
 /* If we can get all the information we need, let's define the macro!  */
-#if defined (EMACS_GET_TZ_OFFSET_AND_SAVINGS) && defined (EMACS_GET_TZ_NAMES)
+#if defined (EMACS_GET_TZ_OFFSET) && defined (EMACS_GET_TZ_NAMES)
 
 #define EMACS_CURRENT_TIME_ZONE(offset, savings_flag, standard, savings)\
-  do {                                                                 \
-    EMACS_GET_TZ_OFFSET_AND_SAVINGS (offset, savings_flag);            \
+  do {                                                                 \
+    EMACS_TIME t;                                                      \
+    long secs;                                                         \
+    struct tm *tmp;                                                    \
+                                                                       \
+    EMACS_GET_TIME (t);                                                        \
+    secs = EMACS_SECS (t);                                             \
+    tmp = localtime (&secs);                                           \
+    *(savings_flag) = tmp->tm_isdst;                                   \
+                                                                       \
+    EMACS_GET_TZ_OFFSET (offset);                                      \
     EMACS_GET_TZ_NAMES (standard, savings);                            \
   } while (0)
-
-#endif /* ! defined (EMACS_GET_TZ_OFFSET_AND_SAVINGS) && defined (EMACS_GET_TZ_NAMES) */
+#endif /* ! defined (EMACS_GET_TZ_OFFSET) && defined (EMACS_GET_TZ_NAMES) */
 
 #endif /* EMACS_CURRENT_TIME_ZONE */