| 1 |
/* |
| 2 |
* time.h |
| 3 |
* |
| 4 |
* Type definitions and function declarations relating to date and time. |
| 5 |
* |
| 6 |
* $Id: time.h,v c96797f9657b 2016/04/12 14:36:20 keithmarshall $ |
| 7 |
* |
| 8 |
* Written by Colin Peters <colin@bird.fu.is.saga-u.ac.jp> |
| 9 |
* Copyright (C) 1997-2007, 2011, 2015, 2016, MinGW.org Project. |
| 10 |
* |
| 11 |
* |
| 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: |
| 18 |
* |
| 19 |
* The above copyright notice, this permission notice, and the following |
| 20 |
* disclaimer shall be included in all copies or substantial portions of |
| 21 |
* the Software. |
| 22 |
* |
| 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. |
| 30 |
* |
| 31 |
*/ |
| 32 |
#if ! defined _TIME_H || defined __need_time_t |
| 33 |
#pragma GCC system_header |
| 34 |
|
| 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> |
| 42 |
*/ |
| 43 |
#undef __need_time_h |
| 44 |
#define __need_time_t 1 |
| 45 |
#include <sys/types.h> |
| 46 |
|
| 47 |
#ifndef _TIME_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. |
| 51 |
*/ |
| 52 |
#undef __need_struct_timespec |
| 53 |
#undef __need_wchar_decls |
| 54 |
|
| 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> |
| 59 |
*/ |
| 60 |
# define __need_wchar_decls 1 |
| 61 |
|
| 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> |
| 66 |
*/ |
| 67 |
struct tm; |
| 68 |
|
| 69 |
#else |
| 70 |
#define _TIME_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. |
| 75 |
*/ |
| 76 |
#include <_mingw.h> |
| 77 |
|
| 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'. |
| 80 |
*/ |
| 81 |
#define CLOCKS_PER_SEC ((clock_t)(1000)) |
| 82 |
#define CLK_TCK CLOCKS_PER_SEC |
| 83 |
|
| 84 |
#define __need_struct_timespec 1 |
| 85 |
#define __need_wchar_decls 1 |
| 86 |
#endif |
| 87 |
|
| 88 |
#ifndef RC_INVOKED |
| 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. |
| 101 |
*/ |
| 102 |
struct timespec |
| 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. |
| 110 |
*/ |
| 111 |
__time64_t tv_sec; /* seconds; accept 32 or 64 bits */ |
| 112 |
__int32 tv_nsec; /* nanoseconds */ |
| 113 |
}; |
| 114 |
|
| 115 |
# ifdef _MINGW32_SOURCE_EXTENDED |
| 116 |
struct __mingw32_expanded_timespec |
| 117 |
{ |
| 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... |
| 122 |
*/ |
| 123 |
union |
| 124 |
{ /* ...within this anonymous union, allowing tv_sec to accommodate |
| 125 |
* seconds expressed in either of Microsoft's (ambiguously sized) |
| 126 |
* time_t representations. |
| 127 |
*/ |
| 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 */ |
| 131 |
}; |
| 132 |
__int32 tv_nsec; /* nanoseconds */ |
| 133 |
}; |
| 134 |
# endif /* _MINGW32_SOURCE_EXTENDED */ |
| 135 |
|
| 136 |
# define __struct_timespec_defined 1 |
| 137 |
#endif |
| 138 |
|
| 139 |
#ifdef _TIME_H |
| 140 |
#ifdef _MINGW32_SOURCE_EXTENDED |
| 141 |
|
| 142 |
_BEGIN_C_DECLS |
| 143 |
|
| 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. |
| 151 |
*/ |
| 152 |
struct __mingw32_expanded_timespec *mingw_timespec( struct timespec *__tv ) |
| 153 |
{ return (struct __mingw32_expanded_timespec *)(__tv); } |
| 154 |
|
| 155 |
_END_C_DECLS |
| 156 |
|
| 157 |
#endif /* _MINGW32_SOURCE_EXTENDED */ |
| 158 |
|
| 159 |
/* <time.h> is also required to duplicate the following type definitions, |
| 160 |
* which are nominally defined in <stddef.h> |
| 161 |
*/ |
| 162 |
#define __need_NULL |
| 163 |
#define __need_wchar_t |
| 164 |
#define __need_size_t |
| 165 |
#include <stddef.h> |
| 166 |
|
| 167 |
/* A type for measuring processor time in clock ticks; (no need to |
| 168 |
* guard this, since it isn't defined elsewhere). |
| 169 |
*/ |
| 170 |
typedef long clock_t; |
| 171 |
|
| 172 |
struct tm |
| 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. |
| 177 |
*/ |
| 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 */ |
| 187 |
}; |
| 188 |
|
| 189 |
_BEGIN_C_DECLS |
| 190 |
|
| 191 |
_CRTIMP __cdecl __MINGW_NOTHROW clock_t clock (void); |
| 192 |
|
| 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. |
| 200 |
*/ |
| 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 *); |
| 204 |
#endif |
| 205 |
|
| 206 |
/* These functions write to and return pointers to static buffers that may |
| 207 |
* be overwritten by other function calls. Yikes! |
| 208 |
* |
| 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... |
| 214 |
*/ |
| 215 |
_CRTIMP __cdecl __MINGW_NOTHROW char *asctime (const struct tm *); |
| 216 |
|
| 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. |
| 220 |
*/ |
| 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 *); |
| 224 |
#endif |
| 225 |
|
| 226 |
_CRTIMP __cdecl __MINGW_NOTHROW |
| 227 |
size_t strftime (char *, size_t, const char *, const struct tm *); |
| 228 |
|
| 229 |
#ifndef __STRICT_ANSI__ |
| 230 |
extern _CRTIMP __cdecl __MINGW_NOTHROW void _tzset (void); |
| 231 |
|
| 232 |
#ifndef _NO_OLDNAMES |
| 233 |
extern _CRTIMP __cdecl __MINGW_NOTHROW void tzset (void); |
| 234 |
#endif |
| 235 |
|
| 236 |
_CRTIMP __cdecl __MINGW_NOTHROW char *_strdate (char *); |
| 237 |
_CRTIMP __cdecl __MINGW_NOTHROW char *_strtime (char *); |
| 238 |
|
| 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. |
| 243 |
*/ |
| 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 *); |
| 249 |
|
| 250 |
#endif /* __MSVCR61_DLL, _WIN32_WINNT_WIN2K, and descendants. */ |
| 251 |
|
| 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. |
| 255 |
*/ |
| 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 *); |
| 265 |
|
| 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': |
| 272 |
*/ |
| 273 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t time (time_t *__v) |
| 274 |
{ return _time32 (__v); } |
| 275 |
|
| 276 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW double difftime (time_t __v1, time_t __v2) |
| 277 |
{ return _difftime32 (__v1, __v2); } |
| 278 |
|
| 279 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t mktime (struct tm *__v) |
| 280 |
{ return _mktime32 (__v); } |
| 281 |
|
| 282 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t _mkgmtime (struct tm *__v) |
| 283 |
{ return _mkgmtime32 (__v); } |
| 284 |
|
| 285 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW char *ctime (const time_t *__v) |
| 286 |
{ return _ctime32 (__v); } |
| 287 |
|
| 288 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *__v) |
| 289 |
{ return _gmtime32 (__v); } |
| 290 |
|
| 291 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *__v) |
| 292 |
{ return _localtime32 (__v); } |
| 293 |
|
| 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': |
| 298 |
*/ |
| 299 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t time (time_t *__v) |
| 300 |
{ return _time64 (__v); } |
| 301 |
|
| 302 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW double difftime (time_t __v1, time_t __v2) |
| 303 |
{ return _difftime64 (__v1, __v2); } |
| 304 |
|
| 305 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t mktime (struct tm *__v) |
| 306 |
{ return _mktime64 (__v); } |
| 307 |
|
| 308 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW time_t _mkgmtime (struct tm *__v) |
| 309 |
{ return _mkgmtime64 (__v); } |
| 310 |
|
| 311 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW char *ctime (const time_t *__v) |
| 312 |
{ return _ctime64 (__v); } |
| 313 |
|
| 314 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *gmtime (const time_t *__v) |
| 315 |
{ return _gmtime64 (__v); } |
| 316 |
|
| 317 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW struct tm *localtime (const time_t *__v) |
| 318 |
{ return _localtime64 (__v); } |
| 319 |
|
| 320 |
# endif /* _USE_32BIT_TIME_T brain damage */ |
| 321 |
#endif /* >=__MSVCR80.DLL || >=_WIN32_WINNT_VISTA */ |
| 322 |
|
| 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 |
| 326 |
* elements). |
| 327 |
*/ |
| 328 |
#ifdef __MSVCRT__ |
| 329 |
/* These are for compatibility with pre-VC 5.0 supplied MSVCRT.DLL |
| 330 |
*/ |
| 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); |
| 334 |
|
| 335 |
__MINGW_IMPORT int _daylight; |
| 336 |
__MINGW_IMPORT long _timezone; |
| 337 |
__MINGW_IMPORT char *_tzname[2]; |
| 338 |
|
| 339 |
#else /* !__MSVCRT__ (i.e. using CRTDLL.DLL) */ |
| 340 |
#ifndef __DECLSPEC_SUPPORTED |
| 341 |
|
| 342 |
extern int *_imp___daylight_dll; |
| 343 |
extern long *_imp___timezone_dll; |
| 344 |
extern char **_imp___tzname; |
| 345 |
|
| 346 |
#define _daylight (*_imp___daylight_dll) |
| 347 |
#define _timezone (*_imp___timezone_dll) |
| 348 |
#define _tzname (*_imp___tzname) |
| 349 |
|
| 350 |
#else /* __DECLSPEC_SUPPORTED */ |
| 351 |
|
| 352 |
__MINGW_IMPORT int _daylight_dll; |
| 353 |
__MINGW_IMPORT long _timezone_dll; |
| 354 |
__MINGW_IMPORT char *_tzname[2]; |
| 355 |
|
| 356 |
#define _daylight _daylight_dll |
| 357 |
#define _timezone _timezone_dll |
| 358 |
|
| 359 |
#endif /* __DECLSPEC_SUPPORTED */ |
| 360 |
#endif /* ! __MSVCRT__ */ |
| 361 |
#endif /* ! __STRICT_ANSI__ */ |
| 362 |
|
| 363 |
#ifndef _NO_OLDNAMES |
| 364 |
#ifdef __MSVCRT__ |
| 365 |
|
| 366 |
/* These go in the oldnames import library for MSVCRT. |
| 367 |
*/ |
| 368 |
__MINGW_IMPORT int daylight; |
| 369 |
__MINGW_IMPORT long timezone; |
| 370 |
__MINGW_IMPORT char *tzname[2]; |
| 371 |
|
| 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 |
| 375 |
* of macros. |
| 376 |
*/ |
| 377 |
#define daylight _daylight |
| 378 |
|
| 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. |
| 382 |
*/ |
| 383 |
__MINGW_IMPORT char *tzname[2]; |
| 384 |
|
| 385 |
#endif /* ! __MSVCRT__ */ |
| 386 |
#endif /* ! _NO_OLDNAMES */ |
| 387 |
|
| 388 |
#if _POSIX_C_SOURCE |
| 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). |
| 393 |
*/ |
| 394 |
__cdecl __MINGW_NOTHROW |
| 395 |
int nanosleep( const struct timespec *, struct timespec * ); |
| 396 |
|
| 397 |
#ifndef __NO_INLINE__ |
| 398 |
/* We may conveniently provide an in-line implementation here, |
| 399 |
* in terms of the __mingw_sleep() helper function. |
| 400 |
*/ |
| 401 |
__cdecl __MINGW_NOTHROW |
| 402 |
int __mingw_sleep( unsigned long, unsigned long ); |
| 403 |
|
| 404 |
__CRT_INLINE __LIBIMPL__(( FUNCTION = nanosleep )) |
| 405 |
int nanosleep( const struct timespec *period, struct timespec *residual ) |
| 406 |
{ |
| 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)); |
| 411 |
} |
| 412 |
#endif /* !__NO_INLINE__ */ |
| 413 |
#endif /* _POSIX_C_SOURCE */ |
| 414 |
|
| 415 |
_END_C_DECLS |
| 416 |
|
| 417 |
#endif /* _TIME_H included in its own right */ |
| 418 |
|
| 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. |
| 426 |
*/ |
| 427 |
_BEGIN_C_DECLS |
| 428 |
|
| 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 *); |
| 433 |
|
| 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... |
| 438 |
*/ |
| 439 |
_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime64 (const __time64_t *); |
| 440 |
#endif |
| 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. |
| 445 |
*/ |
| 446 |
_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime32 (const __time32_t *); |
| 447 |
#endif |
| 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. |
| 452 |
*/ |
| 453 |
_CRTIMP __cdecl __MINGW_NOTHROW wchar_t *_wctime (const time_t *); |
| 454 |
|
| 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... |
| 459 |
*/ |
| 460 |
__CRT_ALIAS __cdecl __MINGW_NOTHROW wchar_t *_wctime (const time_t *__v) |
| 461 |
{ |
| 462 |
/* ...in terms of an appropriately selected time_t size specific |
| 463 |
* alternative function, which should be available... |
| 464 |
*/ |
| 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)... |
| 469 |
*/ |
| 470 |
return _wctime32 (__v); |
| 471 |
|
| 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). |
| 475 |
*/ |
| 476 |
return _wctime64 (__v); |
| 477 |
# endif /* !_USE_32BIT_TIME_T */ |
| 478 |
} |
| 479 |
#endif /* __MSVCRT_VERSION__ >= __MSVCR80_DLL */ |
| 480 |
#endif /* __MSVCRT__ && !__STRICT_ANSI__ */ |
| 481 |
|
| 482 |
_CRTIMP __cdecl __MINGW_NOTHROW |
| 483 |
size_t wcsftime (wchar_t *, size_t, const wchar_t *, const struct tm *); |
| 484 |
|
| 485 |
_END_C_DECLS |
| 486 |
|
| 487 |
#endif /* ! (defined _TIME_H && defined _WCHAR_H) */ |
| 488 |
|
| 489 |
/* We're done with all <time.h> specific content selectors; clear them. |
| 490 |
*/ |
| 491 |
#undef __need_time_t |
| 492 |
#undef __need_struct_timespec |
| 493 |
#undef __need_wchar_decls |
| 494 |
|
| 495 |
#endif /* ! RC_INVOKED */ |
| 496 |
#endif /* !_TIME_H after __need_time_t processing */ |
| 497 |
#endif /* !_TIME_H: $RCSfile: time.h,v $: end of file */ |