systime.h 4.52 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
/* SVr4 doesn't actually declare this in its #include files.  */
#ifdef USG5_4
extern long timezone;
#endif

36 37 38 39 40 41
#ifdef VMS
#ifdef VAXC
#include "vmstime.h"
#endif
#endif

Jim Blandy's avatar
Jim Blandy committed
42

Jim Blandy's avatar
Jim Blandy committed
43 44
/* 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
45
   the timeout argument to the select  system call.
Jim Blandy's avatar
Jim Blandy committed
46 47 48 49 50

   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
51 52 53 54
   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
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

   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

75 76
#define EMACS_HAS_USECS

Jim Blandy's avatar
Jim Blandy committed
77 78 79 80
#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
81
#define EMACS_SET_USECS(time, microseconds) ((time).tv_usec = (microseconds))
Jim Blandy's avatar
Jim Blandy committed
82 83 84

#define EMACS_GET_TIME(time)					\
{								\
Jim Blandy's avatar
Jim Blandy committed
85
  struct timezone dummy;					\
Jim Blandy's avatar
Jim Blandy committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
  gettimeofday (&(time), &dummy);				\
}

#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
110
#else /* ! defined (HAVE_TIMEVAL) */
Jim Blandy's avatar
Jim Blandy committed
111 112 113

#define EMACS_TIME int
#define EMACS_SECS(time)		    (time)
Jim Blandy's avatar
Jim Blandy committed
114
#define EMACS_USECS(time)		    0
Jim Blandy's avatar
Jim Blandy committed
115
#define EMACS_SET_SECS(time, seconds)	    ((time) = (seconds))
Jim Blandy's avatar
Jim Blandy committed
116
#define EMACS_SET_USECS(time, usecs)	    0
Jim Blandy's avatar
Jim Blandy committed
117 118 119 120 121 122

#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
123
#endif /* ! defined (HAVE_TIMEVAL) */
Jim Blandy's avatar
Jim Blandy committed
124 125 126 127 128 129 130 131

#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
132
    time_t tv[2];						\
Jim Blandy's avatar
Jim Blandy committed
133 134 135 136 137
    tv[0] = EMACS_SECS (atime);					\
    tv[1] = EMACS_SECS (mtime);					\
    utime ((path), tv);						\
  }

Jim Blandy's avatar
Jim Blandy committed
138
#else /* ! defined (USE_UTIME) */
Jim Blandy's avatar
Jim Blandy committed
139 140 141 142 143 144 145 146 147

#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
148
#endif /* ! defined (USE_UTIME) */