systime.h 4.96 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* systime.h - System-dependent definitions for time manipulations.
Jim Blandy's avatar
Jim Blandy committed
2
   Copyright (C) 1993 Free Software Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

This file is part of GNU Emacs.

GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

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.  */

20
#ifdef TIME_WITH_SYS_TIME
Jim Blandy's avatar
Jim Blandy committed
21
#include <sys/time.h>
Jim Blandy's avatar
Jim Blandy committed
22
#include <time.h>
23
#else
24 25
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
26 27
#else
#include <time.h>
28
#endif
Jim Blandy's avatar
Jim Blandy committed
29
#endif
Jim Blandy's avatar
Jim Blandy committed
30

31 32 33 34 35 36
#ifdef HAVE_TZNAME
#ifndef tzname		/* For SGI.  */
extern char *tzname[];	/* RS6000 and others want it this way.  */
#endif
#endif

37 38 39 40 41
/* SVr4 doesn't actually declare this in its #include files.  */
#ifdef USG5_4
extern long timezone;
#endif

42 43 44 45 46 47
#ifdef VMS
#ifdef VAXC
#include "vmstime.h"
#endif
#endif

Jim Blandy's avatar
Jim Blandy committed
48

Jim Blandy's avatar
Jim Blandy committed
49 50
/* EMACS_TIME is the type to use to represent temporal intervals -
   struct timeval on some systems, int on others.  It can be passed as
Richard M. Stallman's avatar
Richard M. Stallman committed
51
   the timeout argument to the select  system call.
Jim Blandy's avatar
Jim Blandy committed
52 53 54 55 56

   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.
Jim Blandy's avatar
Jim Blandy committed
57 58 59 60
   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.
Jim Blandy's avatar
Jim Blandy committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

   EMACS_SET_SECS_USECS (TIME, SECS, USECS) sets both components of TIME.

   EMACS_GET_TIME (TIME) stores the current system time in TIME, which
	should be an lvalue.
   EMACS_SET_UTIMES (PATH, ATIME, MTIME) changes the last-access and
	last-modification times of the file named PATH to ATIME and
	MTIME, which are EMACS_TIMEs.

   EMACS_ADD_TIME (DEST, SRC1, SRC2) adds SRC1 to SRC2 and stores the
	result in DEST.  SRC should not be negative.

   EMACS_SUB_TIME (DEST, SRC1, SRC2) subtracts SRC2 from SRC1 and
	stores the result in DEST.  SRC should not be negative. 
   EMACS_TIME_NEG_P (TIME) is true iff TIME is negative.

*/

#ifdef HAVE_TIMEVAL

81 82
#define EMACS_HAS_USECS

Jim Blandy's avatar
Jim Blandy committed
83 84 85 86
#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))
Jim Blandy's avatar
Jim Blandy committed
87
#define EMACS_SET_USECS(time, microseconds) ((time).tv_usec = (microseconds))
Jim Blandy's avatar
Jim Blandy committed
88

89 90 91 92 93 94 95
/* On SVR4, the compiler may complain if given this extra BSD arg.  */
#ifdef USG5_4
#define EMACS_GET_TIME(time)                                  \
{                                                             \
  gettimeofday (&(time));                                     \
}
#else /* not USG5_4 */
Jim Blandy's avatar
Jim Blandy committed
96 97
#define EMACS_GET_TIME(time)					\
{								\
Jim Blandy's avatar
Jim Blandy committed
98
  struct timezone dummy;					\
Jim Blandy's avatar
Jim Blandy committed
99 100
  gettimeofday (&(time), &dummy);				\
}
101
#endif /* not USG5_4 */
Jim Blandy's avatar
Jim Blandy committed
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

#define EMACS_ADD_TIME(dest, src1, src2)			\
{								\
  (dest).tv_sec  = (src1).tv_sec  + (src2).tv_sec;		\
  (dest).tv_usec = (src1).tv_usec + (src2).tv_usec;		\
  if ((dest).tv_usec > 1000000)					\
    (dest).tv_usec -= 1000000, (dest).tv_sec++;			\
}

#define EMACS_SUB_TIME(dest, src1, src2)			\
{								\
  (dest).tv_sec  = (src1).tv_sec  - (src2).tv_sec;		\
  (dest).tv_usec = (src1).tv_usec - (src2).tv_usec;		\
  if ((dest).tv_usec < 0)					\
    (dest).tv_usec += 1000000, (dest).tv_sec--;			\
}

#define EMACS_TIME_NEG_P(time)					\
  ((time).tv_sec < 0						\
   || ((time).tv_sec == 0					\
       && (time).tv_usec < 0))

Jim Blandy's avatar
Jim Blandy committed
124
#else /* ! defined (HAVE_TIMEVAL) */
Jim Blandy's avatar
Jim Blandy committed
125 126 127

#define EMACS_TIME int
#define EMACS_SECS(time)		    (time)
Jim Blandy's avatar
Jim Blandy committed
128
#define EMACS_USECS(time)		    0
Jim Blandy's avatar
Jim Blandy committed
129
#define EMACS_SET_SECS(time, seconds)	    ((time) = (seconds))
Jim Blandy's avatar
Jim Blandy committed
130
#define EMACS_SET_USECS(time, usecs)	    0
Jim Blandy's avatar
Jim Blandy committed
131 132 133 134 135 136

#define EMACS_GET_TIME(t) ((t) = time ((long *) 0))
#define EMACS_ADD_TIME(dest, src1, src2) ((dest) = (src1) + (src2))
#define EMACS_SUB_TIME(dest, src1, src2) ((dest) = (src1) - (src2))
#define EMACS_TIME_NEG_P(t) ((t) < 0)

Jim Blandy's avatar
Jim Blandy committed
137
#endif /* ! defined (HAVE_TIMEVAL) */
Jim Blandy's avatar
Jim Blandy committed
138 139 140 141 142 143 144 145

#define EMACS_SET_SECS_USECS(time, secs, usecs) 		\
  (EMACS_SET_SECS (time, secs), EMACS_SET_USECS (time, usecs))

#ifdef USE_UTIME

#define EMACS_SET_UTIMES(path, atime, mtime)			\
  {								\
Jim Blandy's avatar
Jim Blandy committed
146
    time_t tv[2];						\
Jim Blandy's avatar
Jim Blandy committed
147 148 149 150 151
    tv[0] = EMACS_SECS (atime);					\
    tv[1] = EMACS_SECS (mtime);					\
    utime ((path), tv);						\
  }

Jim Blandy's avatar
Jim Blandy committed
152
#else /* ! defined (USE_UTIME) */
Jim Blandy's avatar
Jim Blandy committed
153 154 155 156 157 158 159 160 161

#define EMACS_SET_UTIMES(path, atime, mtime)			\
  {								\
    EMACS_TIME tv[2];						\
    tv[0] = atime;						\
    tv[1] = mtime;						\
    utimes ((path), tv);					\
  }

Jim Blandy's avatar
Jim Blandy committed
162
#endif /* ! defined (USE_UTIME) */