4 * Type definitions and function declarations relating to date and time.
8 * Written by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
9 * Copyright (C) 1997-2007, 2011, 2015, 2016, MinGW.org Project.
12 * Permission is hereby granted, free of charge, to any person obtaining a
13 * copy of this software and associated documentation files (the "Software"),
14 * to deal in the Software without restriction, including without limitation
15 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 * and/or sell copies of the Software, and to permit persons to whom the
17 * Software is furnished to do so, subject to the following conditions:
19 * The above copyright notice, this permission notice, and the following
20 * disclaimer shall be included in all copies or substantial portions of
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OR OTHER
29 * DEALINGS IN THE SOFTWARE.
32 #if ! defined _TIME_H || defined __need_time_t
33 #pragma GCC system_header
35 /* Irrespective of whether this is normal or selective inclusion of
36 * <time.h>, we ALWAYS require the definition for time_t; get it by
37 * selective inclusion from its primary source, in <sys/types.h>;
38 * note that we must ALWAYS delegate this, when __need_time_t is
39 * defined, even when _TIME_H had been defined previously, to ensure
40 * that __need_time_t is properly reset, and thus cannot compromise
41 * a later inclusion of <sys/types.h>
44 #define __need_time_t 1
45 #include <sys/types.h>
48 /* To support selective partial inclusion, we do not immediately define
49 * the normal _TIME_H guard macro; initially, we also clear all of those
50 * declaraction subset selection macros which are applicable herein.
52 #undef __need_struct_timespec
53 #undef __need_wchar_decls
55 #if defined __WCHAR_H_SOURCED__
56 /* This is selective inclusion by <wchar.h>; thus, we do not define the
57 * _TIME_H guard macro, and we select only the minimally required subset
58 * of declarations to be exposed from within <time.h>
60 # define __need_wchar_decls 1
62 /* Both ISO-C and POSIX stipulate that <wchar.h> shall declare "struct tm"
63 * as an incomplete structure, with its complete declaration to be provided
64 * by <time.h>; provide an incomplete forward declaration, to satisfy this
65 * minimal requirement for selective inclusion by <wchar.h>
71 /* This is normal inclusion of <time.h>, in its own right. All our system
72 * headers are required to include <_mingw.h>, but in the case of selective
73 * inclusion, we delegate that responsibility to the including header; when
74 * including <time.h> directly, we must fulfil this requirement now.
78 /* Number of clock ticks per second. A clock tick is the unit by which
79 * processor time is measured and is returned by 'clock'.
81 #define CLOCKS_PER_SEC ((clock_t)(1000))
82 #define CLK_TCK CLOCKS_PER_SEC
84 #define __need_struct_timespec 1
85 #define __need_wchar_decls 1
89 #if defined __need_struct_timespec && ! __struct_timespec_defined
90 /* Structure timespec is mandated by POSIX, for specification of
91 * intervals with the greatest precision supported by the OS kernel.
92 * Although this allows for specification to nanosecond precision, do
93 * not be deluded into any false expectation that such short intervals
94 * can be realized on Windows; on Win9x derivatives, the metronome used
95 * by the process scheduler has a period of ~55 milliseconds, while for
96 * WinNT derivatives, the corresponding period is ~15 milliseconds; thus,
97 * the shortest intervals which can be realistically timed will range
98 * from 0..55 milliseconds on Win9x hosts, and from 0..15 ms on WinNT,
99 * with period values normally distributed around means of ~27.5 ms
100 * and ~7.5 ms, for the two system types respectively.
103 { /* Period is sum of tv_sec + tv_nsec; while 32-bits is sufficient
104 * to accommodate tv_nsec, we use 64-bit __time64_t for tv_sec, to
105 * ensure that we have a sufficiently large field to accommodate
106 * Microsoft's ambiguous __time32_t vs. __time64_t representation
107 * of time_t; we may resolve this ambiguity locally, by casting a
108 * pointer to a struct timespec to point to an identically sized
109 * struct __mingw32_timespec, which is defined below.
111 __time64_t tv_sec; /* seconds; accept 32 or 64 bits */
112 __int32 tv_nsec; /* nanoseconds */
115 # ifdef _MINGW32_SOURCE_EXTENDED
116 struct __mingw32_expanded_timespec
118 /* Equivalent of struct timespec, with disambiguation for the
119 * 32-bit vs. 64-bit tv_sec field declaration. Period is the
120 * sum of tv_sec + tv_nsec; we use explicitly sized types to
121 * avoid 32-bit vs. 64-bit time_t ambiguity...
124 { /* ...within this anonymous union, allowing tv_sec to accommodate
125 * seconds expressed in either of Microsoft's (ambiguously sized)
126 * time_t representations.
128 __time64_t __tv64_sec; /* unambiguously 64 bits */
129 __time32_t __tv32_sec; /* unambiguously 32 bits */
130 time_t tv_sec; /* ambiguously 32 or 64 bits */
132 __int32 tv_nsec; /* nanoseconds */
134 # endif /* _MINGW32_SOURCE_EXTENDED */
136 # define __struct_timespec_defined 1
140 #ifdef _MINGW32_SOURCE_EXTENDED
144 __CRT_ALIAS __LIBIMPL__(( FUNCTION = mingw_timespec ))
145 /* This non-ANSI convenience function facilitates access to entities
146 * defined as struct timespec, while exposing the broken down form of
147 * the tv_sec field, as declared within struct __mingw32_timespec. It
148 * is exposed only when _MINGW32_SOURCE_EXTENDED is defined, which is
149 * normally implicitly the case, except when in __STRICT_ANSI__ mode
150 * unless the user defines it explicitly.
152 struct __mingw32_expanded_timespec *mingw_timespec( struct timespec *__tv )
153 { return (struct __mingw32_expanded_timespec *)(__tv); }
157 #endif /* _MINGW32_SOURCE_EXTENDED */
159 /* <time.h> is also required to duplicate the following type definitions,
160 * which are nominally defined in <stddef.h>
163 #define __need_wchar_t
164 #define __need_size_t
167 /* A type for measuring processor time in clock ticks; (no need to
168 * guard this, since it isn't defined elsewhere).
170 typedef long clock_t;
173 { /* A structure for storing the attributes of a broken-down time; (once
174 * again, it isn't defined elsewhere, so no guard is necessary). Note
175 * that we are within the scope of <time.h> itself, so we must provide
176 * the complete structure declaration here.
178 int tm_sec; /* Seconds: 0-60 (to accommodate leap seconds) */
179 int tm_min; /* Minutes: 0-59 */
180 int tm_hour; /* Hours since midnight: 0-23 */
181 int tm_mday; /* Day of the month: 1-31 */
182 int tm_mon; /* Months *since* January: 0-11 */
183 int tm_year; /* Years since 1900 */
184 int tm_wday; /* Days since Sunday (0-6) */
185 int tm_yday; /* Days since Jan. 1: 0-365 */
186 int tm_isdst; /* +1=Daylight Savings Time, 0=No DST, -1=unknown */
191 _CRTIMP __cdecl __MINGW_NOTHROW clock_t clock (void);
193 #if __MSVCRT_VERSION__ < __MSVCR80_DLL
194 /* Although specified as ISO-C functions, Microsoft withdrew direct
195 * support for these, with their ISO-C names, from MSVCR80.DLL onwards,
196 * preferring to map them via header file macros, to alternatively named
197 * DLL functions with ambiguous time_t representations; they remain in
198 * MSVCRT.DLL, however, with their original ISO-C names, and time_t
199 * unambiguously represented as a 32-bit data type.
201 _CRTIMP __cdecl __MINGW_NOTHROW time_t time (time_t *);
202 _CRTIMP __cdecl __MINGW_NOTHROW double difftime (time_t, time_t);
203 _CRTIMP __cdecl __MINGW_NOTHROW time_t mktime (struct tm *);
206 /* These functions write to and return pointers to static buffers that may
207 * be overwritten by other function calls. Yikes!
209 * NOTE: localtime, and perhaps the others of the four functions grouped
210 * below may return NULL if their argument is not 'acceptable'. Also note
211 * that calling asctime with a NULL pointer will produce an Invalid Page
212 * Fault and crap out your program. Guess how I know. Hint: stat called on
213 * a directory gives 'invalid' times in st_atime etc...
215 _CRTIMP __cdecl __MINGW_NOTHROW char *asctime (const struct tm *);
217 #if __MSVCRT_VERSION__ < __MSVCR80_DLL
218 /* Once again, these have been withdrawn from MSVCR80.DLL, (and later),
219 * but remain in MSVCRT.DLL, with unambiguously 32-bit time_t.
221 _CRTIMP __cdecl __MINGW_NOTHROW char *ctime (const time_t *);
222 _CRTIMP __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *);
223 _CRTIMP __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *);
226 _CRTIMP __cdecl __MINGW_NOTHROW
227 size_t strftime (char *, size_t, const char *, const struct tm *);
229 #ifndef __STRICT_ANSI__
230 extern _CRTIMP __cdecl __MINGW_NOTHROW void _tzset (void);
233 extern _CRTIMP __cdecl __MINGW_NOTHROW void tzset (void);
236 _CRTIMP __cdecl __MINGW_NOTHROW char *_strdate (char *);
237 _CRTIMP __cdecl __MINGW_NOTHROW char *_strtime (char *);
239 #if __MSVCRT_VERSION__ >= __MSVCR61_DLL || _WIN32_WINNT >= _WIN32_WINNT_WIN2K
240 /* These 64-bit time_t variant functions first became available in
241 * MSVCR61.DLL, and its descendants; they were subsequently included
242 * in MSVCRT.DLL, from its Win2K release onwards.
244 _CRTIMP __cdecl __MINGW_NOTHROW __time64_t _time64( __time64_t *);
245 _CRTIMP __cdecl __MINGW_NOTHROW __time64_t _mktime64 (struct tm *);
246 _CRTIMP __cdecl __MINGW_NOTHROW char *_ctime64 (const __time64_t *);
247 _CRTIMP __cdecl __MINGW_NOTHROW struct tm *_gmtime64 (const __time64_t *);
248 _CRTIMP __cdecl __MINGW_NOTHROW struct tm *_localtime64 (const __time64_t *);
250 #endif /* __MSVCR61_DLL, _WIN32_WINNT_WIN2K, and descendants. */
252 #if __MSVCRT_VERSION__ >= __MSVCR80_DLL || _WIN32_WINNT >= _WIN32_WINNT_VISTA
253 /* The following were introduced in MSVCR80.DLL, and they subsequently
254 * appeared in MSVCRT.DLL, from Windows-Vista onwards.
256 _CRTIMP __cdecl __MINGW_NOTHROW char *_ctime32 (const __time32_t *);
257 _CRTIMP __cdecl __MINGW_NOTHROW double _difftime32 (__time32_t, __time32_t);
258 _CRTIMP __cdecl __MINGW_NOTHROW double _difftime64 (__time64_t, __time64_t);
259 _CRTIMP __cdecl __MINGW_NOTHROW struct tm *_gmtime32 (const __time32_t *);
260 _CRTIMP __cdecl __MINGW_NOTHROW struct tm *_localtime32 (const __time32_t *);
261 _CRTIMP __cdecl __MINGW_NOTHROW __time32_t _mktime32 (struct tm *);
262 _CRTIMP __cdecl __MINGW_NOTHROW __time32_t _mkgmtime32 (struct tm *);
263 _CRTIMP __cdecl __MINGW_NOTHROW __time64_t _mkgmtime64 (struct tm *);
264 _CRTIMP __cdecl __MINGW_NOTHROW __time32_t _time32 (__time32_t *);
266 # if __MSVCRT_VERSION__ >= __MSVCR80_DLL && defined _USE_32BIT_TIME_T
267 /* Users of MSVCR80.DLL and later, (but not users of MSVCRT.DLL, even
268 * for _WIN32_WINNT_VISTA and later), must contend with the omission of
269 * the following functions from their DLL of choice, thus requiring these
270 * brain damaged mappings, in terms of an ambiguously defined 'time_t';
271 * thus, when 'time_t' is declared to be equivalent to '__time32_t':
273 __CRT_ALIAS __cdecl __MINGW_NOTHROW time_t time (time_t *__v)
274 { return _time32 (__v); }
276 __CRT_ALIAS __cdecl __MINGW_NOTHROW double difftime (time_t __v1, time_t __v2)
277 { return _difftime32 (__v1, __v2); }
279 __CRT_ALIAS __cdecl __MINGW_NOTHROW time_t mktime (struct tm *__v)
280 { return _mktime32 (__v); }
282 __CRT_ALIAS __cdecl __MINGW_NOTHROW time_t _mkgmtime (struct tm *__v)
283 { return _mkgmtime32 (__v); }
285 __CRT_ALIAS __cdecl __MINGW_NOTHROW char *ctime (const time_t *__v)
286 { return _ctime32 (__v); }
288 __CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *__v)
289 { return _gmtime32 (__v); }
291 __CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *__v)
292 { return _localtime32 (__v); }
294 # elif __MSVCRT_VERSION__ >= __MSVCR80_DLL
295 /* Correspondingly, for users of MSVCR80.DLL and later only, when there
296 * is no explicit declaration to direct the specification of 'time_t', and
297 * thus 'time_t' is assumed to be equivalent to '__time64_t':
299 __CRT_ALIAS __cdecl __MINGW_NOTHROW time_t time (time_t *__v)
300 { return _time64 (__v); }
302 __CRT_ALIAS __cdecl __MINGW_NOTHROW double difftime (time_t __v1, time_t __v2)
303 { return _difftime64 (__v1, __v2); }
305 __CRT_ALIAS __cdecl __MINGW_NOTHROW time_t mktime (struct tm *__v)
306 { return _mktime64 (__v); }
308 __CRT_ALIAS __cdecl __MINGW_NOTHROW time_t _mkgmtime (struct tm *__v)
309 { return _mkgmtime64 (__v); }
311 __CRT_ALIAS __cdecl __MINGW_NOTHROW char *ctime (const time_t *__v)
312 { return _ctime64 (__v); }
314 __CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *__v)
315 { return _gmtime64 (__v); }
317 __CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *__v)
318 { return _localtime64 (__v); }
320 # endif /* _USE_32BIT_TIME_T brain damage */
321 #endif /* >=__MSVCR80.DLL || >=_WIN32_WINNT_VISTA */
323 /* _daylight: non zero if daylight savings time is used.
324 * _timezone: difference in seconds between GMT and local time.
325 * _tzname: standard/daylight savings time zone names (an array with two
329 /* These are for compatibility with pre-VC 5.0 supplied MSVCRT.DLL
331 extern _CRTIMP __cdecl __MINGW_NOTHROW int *__p__daylight (void);
332 extern _CRTIMP __cdecl __MINGW_NOTHROW long *__p__timezone (void);
333 extern _CRTIMP __cdecl __MINGW_NOTHROW char **__p__tzname (void);
335 __MINGW_IMPORT int _daylight;
336 __MINGW_IMPORT long _timezone;
337 __MINGW_IMPORT char *_tzname[2];
339 #else /* !__MSVCRT__ (i.e. using CRTDLL.DLL) */
340 #ifndef __DECLSPEC_SUPPORTED
342 extern int *_imp___daylight_dll;
343 extern long *_imp___timezone_dll;
344 extern char **_imp___tzname;
346 #define _daylight (*_imp___daylight_dll)
347 #define _timezone (*_imp___timezone_dll)
348 #define _tzname (*_imp___tzname)
350 #else /* __DECLSPEC_SUPPORTED */
352 __MINGW_IMPORT int _daylight_dll;
353 __MINGW_IMPORT long _timezone_dll;
354 __MINGW_IMPORT char *_tzname[2];
356 #define _daylight _daylight_dll
357 #define _timezone _timezone_dll
359 #endif /* __DECLSPEC_SUPPORTED */
360 #endif /* ! __MSVCRT__ */
361 #endif /* ! __STRICT_ANSI__ */
366 /* These go in the oldnames import library for MSVCRT.
368 __MINGW_IMPORT int daylight;
369 __MINGW_IMPORT long timezone;
370 __MINGW_IMPORT char *tzname[2];
372 #else /* ! __MSVCRT__ */
373 /* CRTDLL is royally messed up when it comes to these macros.
374 * TODO: import and alias these via oldnames import library instead
377 #define daylight _daylight
379 /* NOTE: timezone not defined as a macro because it would conflict with
380 * struct timezone in sys/time.h. Also, tzname used to a be macro, but
381 * now it's in moldname.
383 __MINGW_IMPORT char *tzname[2];
385 #endif /* ! __MSVCRT__ */
386 #endif /* ! _NO_OLDNAMES */
389 /* The nanosleep() function provides the most general purpose API for
390 * process/thread suspension; it provides for specification of periods
391 * ranging from ~7.5 ms mean, (on WinNT derivatives; ~27.5 ms on Win9x),
392 * extending up to ~136 years, (effectively eternity).
394 __cdecl __MINGW_NOTHROW
395 int nanosleep( const struct timespec *, struct timespec * );
397 #ifndef __NO_INLINE__
398 /* We may conveniently provide an in-line implementation here,
399 * in terms of the __mingw_sleep() helper function.
401 __cdecl __MINGW_NOTHROW
402 int __mingw_sleep( unsigned long, unsigned long );
404 __CRT_INLINE __LIBIMPL__(( FUNCTION = nanosleep ))
405 int nanosleep( const struct timespec *period, struct timespec *residual )
407 if( residual != (void *)(0) )
408 residual->tv_sec = (__time64_t)(residual->tv_nsec = 0);
409 return __mingw_sleep((unsigned)(period->tv_sec), (period->tv_sec < 0LL)
410 ? (unsigned)(-1) : (unsigned)(period->tv_nsec));
412 #endif /* !__NO_INLINE__ */
413 #endif /* _POSIX_C_SOURCE */
417 #endif /* _TIME_H included in its own right */
419 #if __need_wchar_decls && ! (defined _TIME_H && defined _WCHAR_H)
420 /* Wide character time function prototypes. These are nominally declared
421 * both here, in <time.h>, and also in <wchar.h>; we declare them here, and
422 * make them available for selective inclusion by <wchar.h>, but such that
423 * the declarations, and in particular any in-line implementation of the
424 * _wctime() function, are visible only on the first time parse, when
425 * one of either _TIME_H, or _WCHAR_H, but not both, is defined.
429 #if defined __MSVCRT__ && ! defined __STRICT_ANSI__
430 _CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wasctime (const struct tm *);
431 _CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wstrdate (wchar_t *);
432 _CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wstrtime (wchar_t *);
434 #if __MSVCRT_VERSION__ >= __MSVCR61_DLL || _WIN32_WINNT >= _WIN32_WINNT_WIN2K
435 /* A __time64_t specific variant of _wctime(), identified as _wctime64(),
436 * first appeared in the non-free MSVC specific MSVCR61.DLL, and was added
437 * to the freely available platform MSVCRT.DLL from Win2K onwards...
439 _CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime64 (const __time64_t *);
441 #if __MSVCRT_VERSION__ >= __MSVCR80_DLL || _WIN32_WINNT >= _WIN32_WINNT_VISTA
442 /* ...whereas its __time32_t specific counterpart, _wctime32(), did not
443 * make an appearance until MSVCR80.DLL, and was not added to MSVCRT.DLL
444 * until the release of Vista.
446 _CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime32 (const __time32_t *);
448 #if __MSVCRT_VERSION__ < __MSVCR80_DLL
449 /* Present in all versions of MSVCRT.DLL, but withdrawn from non-free
450 * MSVC specific releases from MSVCR80.DLL onwards; in all versions of
451 * MSVCRT.DLL, _wctime() accepts a 32-bit time_t argument pointer.
453 _CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime (const time_t *);
455 #else /* __MSVCRT_VERSION__ >= __MSVCR80_DLL */
456 /* For users of the non-free MSVC libraries, we must deal with both the
457 * absence of _wctime(), and with Microsoft's attendant _USE_32BIT_TIME_T
458 * brain damage, as we map an inline replacement...
460 __CRT_ALIAS __cdecl __MINGW_NOTHROW wchar_t *_wctime (const time_t *__v)
462 /* ...in terms of an appropriately selected time_t size specific
463 * alternative function, which should be available...
465 # ifdef _USE_32BIT_TIME_T
466 /* ...i.e. the __time32_t specific _wctime32(), when the user has
467 * enabled this choice; (the only sane choice, if compatibility with
468 * MSVCRT.DLL is desired)...
470 return _wctime32 (__v);
472 # else /* !_USE_32BIT_TIME_T */
473 /* ...or otherwise, the __time64_t specific _wctime64(), (in which
474 * case, compatibility with MSVCRT.DLL must be sacrificed).
476 return _wctime64 (__v);
477 # endif /* !_USE_32BIT_TIME_T */
479 #endif /* __MSVCRT_VERSION__ >= __MSVCR80_DLL */
480 #endif /* __MSVCRT__ && !__STRICT_ANSI__ */
482 _CRTIMP __cdecl __MINGW_NOTHROW
483 size_t wcsftime (wchar_t *, size_t, const wchar_t *, const struct tm *);
487 #endif /* ! (defined _TIME_H && defined _WCHAR_H) */
489 /* We're done with all <time.h> specific content selectors; clear them.
492 #undef __need_struct_timespec
493 #undef __need_wchar_decls
495 #endif /* ! RC_INVOKED */
496 #endif /* !_TIME_H after __need_time_t processing */
497 #endif /* !_TIME_H: $RCSfile$: end of file */