comparison src/systime.h @ 2921:37503f466755

Some time-handling patches from Paul Eggert: * editfns.c (Fcurrent_time_zone): Take an optional argument specifying what (absolute) time should be used to determine the current time zone. Yield just offset and name of time zone, including DST correction. Yield time zone offset in seconds, not minutes. (lisp_time_argument, difftm): New functions. (Fcurrent_time_string): Use lisp_time_argument. * systime.h (EMACS_CURRENT_TIME_ZONE, EMACS_GET_TZ_OFFSET, EMACS_GET_TZ_NAMES): Remove. * config.h.in: Add HAVE_TM_ZONE.
author Jim Blandy <jimb@redhat.com>
date Thu, 20 May 1993 06:29:45 +0000
parents ae964d7149a1
children e94a593c3952
comparison
equal deleted inserted replaced
2920:c47652dc3400 2921:37503f466755
144 tv[1] = mtime; \ 144 tv[1] = mtime; \
145 utimes ((path), tv); \ 145 utimes ((path), tv); \
146 } 146 }
147 147
148 #endif /* ! defined (USE_UTIME) */ 148 #endif /* ! defined (USE_UTIME) */
149
150
151
152 /* EMACS_CURRENT_TIME_ZONE (int *OFFSET, int *SAVINGS_FLAG,
153 char *STANDARD_ABBR, char *SAVINGS_ABBR);
154 expands to a statement which stores information about the current
155 time zone in its arguments.
156
157 *OFFSET is set to the number of minutes EAST of Greenwich at which
158 the site's time zone is located. This should describe the offset
159 to standard time only; if some sort of daylight savings time is in
160 effect, that should not affect this value. Note that the tm_gmtoff
161 member of the struct tm returned by localtime is adjusted for
162 daylight savings, so you don't want to use localtime to set
163 *OFFSET; gettimeofday does the right thing.
164
165 *SAVINGS_FLAG is set to 1 if some sort of daylight savings time is
166 currently in effect, or 0 if no seasonal adjustment is currently
167 active.
168
169 *STANDARD_ABBR points to an array of at least 10 characters, which
170 should be set to the standard abbreviation for the time zone name
171 when daylight savings time is not active. For example, EDT would
172 be appropriate for the Eastern time zone of the USA.
173
174 *SAVINGS_ABBR points to an array of at least 10 characters, which
175 should be set to the standard abbreviation for the time zone name
176 when daylight savings time is active. For example, EST would be
177 appropriate for the Eastern time zone of the USA.
178
179 If the operating system cannot provide all this information, then
180 this macro will not be defined. */
181
182
183 /* The operating system configuration file can define
184 EMACS_CURRENT_TIME_ZONE. If not, we'll take a shot at it here. */
185
186 #ifndef EMACS_CURRENT_TIME_ZONE
187
188 /* System V derivatives have a timezone global variable. */
189 #if defined(USG) || defined(VMS)
190 #define EMACS_GET_TZ_OFFSET(offset) \
191 do { \
192 tzset (); \
193 *(offset) = timezone; \
194 } while (0)
195 #endif
196
197 /* If we have timeval, then we have gettimeofday; that's half the battle. */
198 #if defined (HAVE_TIMEVAL) && !defined (EMACS_GET_TZ_OFFSET)
199 #define EMACS_GET_TZ_OFFSET(offset) \
200 do { \
201 struct timeval dummy; \
202 struct timezone zoneinfo; \
203 \
204 gettimeofday (&dummy, &zoneinfo); \
205 *(offset) = -zoneinfo.tz_minuteswest; \
206 } while (0)
207 #endif /* ! defined (HAVE_TIMEVAL) */
208
209 /* The following sane systems have a tzname array. The timezone function
210 is a stupid idea; timezone names can only be determined geographically,
211 not by Greenwich offset. */
212 #if defined (ultrix) || defined (hpux) || defined (_AIX) || defined (USG) || defined(VMS)
213
214 #define EMACS_GET_TZ_NAMES(standard, savings) \
215 do { \
216 extern char *tzname[2]; \
217 strcpy ((standard), tzname[0]); \
218 strcpy ((savings), tzname[1]); \
219 } while (0)
220
221 #else /* ! defined (ultrix) || defined (hpux) || defined (_AIX) */
222 /* If we are running SunOS, Mt. Xinu BSD, or MACH 2.5, these systems have a
223 timezone function. */
224 #if (defined (hp9000) && ! defined (hpux) && defined (unix)) || defined (MACH) || defined (sun) || defined (NeXT)
225
226 #define EMACS_GET_TZ_NAMES(standard, savings) \
227 do { \
228 struct timeval dummy; \
229 struct timezone zoneinfo; \
230 extern char *timezone (); \
231 \
232 gettimeofday (&dummy, &zoneinfo); \
233 strcpy ((standard), timezone (zoneinfo.tz_minuteswest, 0)); \
234 strcpy ((savings), timezone (zoneinfo.tz_minuteswest, 1)); \
235 } while (0)
236
237 #endif /* ! (defined (hp9000) && ! defined (hpux) && defined (unix)) || defined (MACH) || defined (sun) */
238 #endif /* ! defined (ultrix) || defined (hpux) || defined (_AIX) */
239
240 /* If we can get all the information we need, let's define the macro! */
241 #if defined (EMACS_GET_TZ_OFFSET) && defined (EMACS_GET_TZ_NAMES)
242
243 #define EMACS_CURRENT_TIME_ZONE(offset, savings_flag, standard, savings)\
244 do { \
245 EMACS_TIME t; \
246 long secs; \
247 struct tm *tmp; \
248 \
249 EMACS_GET_TIME (t); \
250 secs = EMACS_SECS (t); \
251 tmp = localtime (&secs); \
252 *(savings_flag) = tmp->tm_isdst; \
253 \
254 EMACS_GET_TZ_OFFSET (offset); \
255 EMACS_GET_TZ_NAMES (standard, savings); \
256 } while (0)
257 #endif /* ! defined (EMACS_GET_TZ_OFFSET) && defined (EMACS_GET_TZ_NAMES) */
258
259 #endif /* EMACS_CURRENT_TIME_ZONE */