Formatting change
[bpt/emacs.git] / src / systime.h
CommitLineData
10a4cc63 1/* systime.h - System-dependent definitions for time manipulations.
f469625a
JB
2 Copyright (C) 1992 Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20#ifdef NEED_TIME_H
21
22/* _h_BSDTYPES is checked because on ISC unix, socket.h includes
23 both time.h and sys/time.h, and the later file is protected
24 from repeated inclusion. We just hope that other systems will
25 use this guard either not at all, or similarly. */
26#ifndef _h_BSDTYPES
27#include <time.h>
10a4cc63
JB
28#endif /* _h_BSDTYPES */
29#else /* ! defined (NEED_TIME_H) */
f469625a
JB
30#ifdef HAVE_TIMEVAL
31#include <sys/time.h>
10a4cc63
JB
32#endif /* ! defined (HAVE_TIMEVAL) */
33#endif /* ! defined (NEED_TIME_H) */
f469625a 34
10a4cc63 35\f
f469625a
JB
36/* EMACS_TIME is the type to use to represent temporal intervals -
37 struct timeval on some systems, int on others. It can be passed as
38 the timeout argument to the select () system call.
39
40 EMACS_SECS (TIME) is an rvalue for the seconds component of TIME.
41 EMACS_SET_SECS (TIME, SECONDS) sets that to SECONDS.
42
43 EMACS_HAS_USECS is defined iff EMACS_TIME has a usecs component.
44 EMACS_USECS (TIME) is an rvalue for the milliseconds component of TIME.
45 This returns zero if EMACS_TIME doesn't have a milliseconds component.
46 EMACS_SET_USECS (TIME, MILLISECONDS) sets that to MILLISECONDS.
47 This does nothing if EMACS_TIME doesn't have a milliseconds component.
48
49 EMACS_SET_SECS_USECS (TIME, SECS, USECS) sets both components of TIME.
50
51 EMACS_GET_TIME (TIME) stores the current system time in TIME, which
52 should be an lvalue.
53 EMACS_SET_UTIMES (PATH, ATIME, MTIME) changes the last-access and
54 last-modification times of the file named PATH to ATIME and
55 MTIME, which are EMACS_TIMEs.
56
57 EMACS_ADD_TIME (DEST, SRC1, SRC2) adds SRC1 to SRC2 and stores the
58 result in DEST. SRC should not be negative.
59
60 EMACS_SUB_TIME (DEST, SRC1, SRC2) subtracts SRC2 from SRC1 and
61 stores the result in DEST. SRC should not be negative.
62 EMACS_TIME_NEG_P (TIME) is true iff TIME is negative.
63
64*/
65
66#ifdef HAVE_TIMEVAL
67
68#define EMACS_TIME struct timeval
69#define EMACS_SECS(time) ((time).tv_sec + 0)
70#define EMACS_USECS(time) ((time).tv_usec + 0)
71#define EMACS_SET_SECS(time, seconds) ((time).tv_sec = (seconds))
72#define EMACS_SET_USECS(time, milliseconds) ((time).tv_usec = (milliseconds))
73
74#define EMACS_GET_TIME(time) \
75{ \
10a4cc63 76 struct timezone dummy; \
f469625a
JB
77 gettimeofday (&(time), &dummy); \
78}
79
80#define EMACS_ADD_TIME(dest, src1, src2) \
81{ \
82 (dest).tv_sec = (src1).tv_sec + (src2).tv_sec; \
83 (dest).tv_usec = (src1).tv_usec + (src2).tv_usec; \
84 if ((dest).tv_usec > 1000000) \
85 (dest).tv_usec -= 1000000, (dest).tv_sec++; \
86}
87
88#define EMACS_SUB_TIME(dest, src1, src2) \
89{ \
90 (dest).tv_sec = (src1).tv_sec - (src2).tv_sec; \
91 (dest).tv_usec = (src1).tv_usec - (src2).tv_usec; \
92 if ((dest).tv_usec < 0) \
93 (dest).tv_usec += 1000000, (dest).tv_sec--; \
94}
95
96#define EMACS_TIME_NEG_P(time) \
97 ((time).tv_sec < 0 \
98 || ((time).tv_sec == 0 \
99 && (time).tv_usec < 0))
100
10a4cc63 101#else /* ! defined (HAVE_TIMEVAL) */
f469625a
JB
102
103#define EMACS_TIME int
104#define EMACS_SECS(time) (time)
ef15f270 105#define EMACS_USECS(time) 0
f469625a 106#define EMACS_SET_SECS(time, seconds) ((time) = (seconds))
ef15f270 107#define EMACS_SET_USECS(time, usecs) 0
f469625a
JB
108
109#define EMACS_GET_TIME(t) ((t) = time ((long *) 0))
110#define EMACS_ADD_TIME(dest, src1, src2) ((dest) = (src1) + (src2))
111#define EMACS_SUB_TIME(dest, src1, src2) ((dest) = (src1) - (src2))
112#define EMACS_TIME_NEG_P(t) ((t) < 0)
113
10a4cc63 114#endif /* ! defined (HAVE_TIMEVAL) */
f469625a
JB
115
116#define EMACS_SET_SECS_USECS(time, secs, usecs) \
117 (EMACS_SET_SECS (time, secs), EMACS_SET_USECS (time, usecs))
118
119#ifdef USE_UTIME
120
121#define EMACS_SET_UTIMES(path, atime, mtime) \
122 { \
ef15f270 123 time_t tv[2]; \
f469625a
JB
124 tv[0] = EMACS_SECS (atime); \
125 tv[1] = EMACS_SECS (mtime); \
126 utime ((path), tv); \
127 }
128
10a4cc63 129#else /* ! defined (USE_UTIME) */
f469625a
JB
130
131#define EMACS_SET_UTIMES(path, atime, mtime) \
132 { \
133 EMACS_TIME tv[2]; \
134 tv[0] = atime; \
135 tv[1] = mtime; \
136 utimes ((path), tv); \
137 }
138
10a4cc63
JB
139#endif /* ! defined (USE_UTIME) */
140
141\f
142
143/* EMACS_CURRENT_TIME_ZONE (int *OFFSET, int *SAVINGS_FLAG,
144 char *STANDARD_ABBR, char *SAVINGS_ABBR);
145 expands to a statement which stores information about the current
146 time zone in its arguments.
147
148 *OFFSET is set to the number of minutes west of Greenwich at which
149 the site's time zone is located. This should describe the offset
150 to standard time only; if some sort of daylight savings time is in
151 effect, that should not affect this value. Note that the tm_gmtoff
152 member of the struct tm returned by localtime is adjusted for
153 daylight savings, so you don't want to use localtime to set
154 *OFFSET; gettimeofday does the right thing.
155
156 *SAVINGS_FLAG is set to 1 if some sort of daylight savings time is
157 currently in effect, or 0 if no seasonal adjustment is currently
158 active.
159
160 *STANDARD_ABBR points to an array of at least 10 characters, which
161 should be set to the standard abbreviation for the time zone name
162 when daylight savings time is not active. For example, EDT would
163 be appropriate for the Eastern time zone of the USA.
164
165 *SAVINGS_ABBR points to an array of at least 10 characters, which
166 should be set to the standard abbreviation for the time zone name
167 when daylight savings time is active. For example, EST would be
168 appropriate for the Eastern time zone of the USA.
169
170 If the operating system cannot provide all this information, then
171 this macro will not be defined. */
172
173
174/* The operating system configuration file can define
175 EMACS_CURRENT_TIME_ZONE. If not, we'll take a shot at it here. */
176
177#ifndef EMACS_CURRENT_TIME_ZONE
178
179/* If we have timeval, then we have gettimeofday; that's half the battle. */
180#ifdef HAVE_TIMEVAL
181#define EMACS_GET_TZ_OFFSET_AND_SAVINGS(offset, savings_flag) \
182 do { \
183 struct timeval dummy; \
184 struct timezone zoneinfo; \
185 \
186 gettimeofday (&dummy, &zoneinfo); \
187 *(offset) = zoneinfo.tz_minuteswest; \
188 *(savings_flag) = zoneinfo.tz_dsttime; \
189 } while (0)
190#endif /* ! defined (HAVE_TIMEVAL) */
191
192
193/* The following sane systems have a tzname array. The timezone() function
194 is a stupid idea; timezone names can only be determined geographically,
195 not by Greenwich offset. */
196#if defined (ultrix) || defined (hpux) || defined (_AIX)
197
198#define EMACS_GET_TZ_NAMES(standard, savings) \
199 do { \
200 extern char *tzname[2]; \
201 strcpy ((standard), tzname[0]); \
202 strcpy ((savings), tzname[1]); \
203 } while (0)
204
205#else /* ! defined (ultrix) || defined (hpux) || defined (_AIX) */
206/* If we are running SunOS, Mt. Xinu BSD, or MACH 2.5, these systems have a
207 timezone() function. */
208#if (defined (hp9000) && ! defined (hpux) && defined (unix)) || defined (MACH) || defined (sun)
209
210#define EMACS_GET_TZ_NAMES(standard, savings) \
211 do { \
212 struct timeval dummy; \
213 struct timezone zoneinfo; \
214 extern char *timezone (); \
215 \
216 gettimeofday (&dummy, &zoneinfo); \
217 strcpy ((standard), timezone (zoneinfo.tz_minuteswest, 0)); \
218 strcpy ((savings), timezone (zoneinfo.tz_minuteswest, 1)); \
219 } while (0)
220
221#endif /* ! (defined (hp9000) && ! defined (hpux) && defined (unix)) || defined (MACH) || defined (sun) */
222#endif /* ! defined (ultrix) || defined (hpux) || defined (_AIX) */
223
224/* If we can get all the information we need, let's define the macro! */
225#if defined (EMACS_GET_TZ_OFFSET_AND_SAVINGS) && defined (EMACS_GET_TZ_NAMES)
226
227#define EMACS_CURRENT_TIME_ZONE(offset, savings_flag, standard, savings)\
228 do { \
229 EMACS_GET_TZ_OFFSET_AND_SAVINGS (offset, savings_flag); \
230 EMACS_GET_TZ_NAMES (standard, savings); \
231 } while (0)
232
233#endif /* ! defined (EMACS_GET_TZ_OFFSET_AND_SAVINGS) && defined (EMACS_GET_TZ_NAMES) */
234
235#endif /* EMACS_CURRENT_TIME_ZONE */