Reactos
at master 648 lines 18 kB view raw
1// 2// time.h 3// 4// Copyright (c) Microsoft Corporation. All rights reserved. 5// 6// The C Standard Library <time.h> header. 7// 8#pragma once 9#ifndef _INC_TIME // include guard for 3rd party interop 10#define _INC_TIME 11 12#include <corecrt.h> 13#include <corecrt_wtime.h> 14 15#pragma warning(push) 16#pragma warning(disable: _UCRT_DISABLED_WARNINGS) 17_UCRT_DISABLE_CLANG_WARNINGS 18 19_CRT_BEGIN_C_HEADER 20 21#ifndef _CRT_USE_CONFORMING_ANNEX_K_TIME 22#define _CRT_USE_CONFORMING_ANNEX_K_TIME 0 23#endif 24 25//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 26// 27// Types 28// 29//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 30typedef long clock_t; 31 32struct _timespec32 33{ 34 __time32_t tv_sec; 35 long tv_nsec; 36}; 37 38struct _timespec64 39{ 40 __time64_t tv_sec; 41 long tv_nsec; 42}; 43 44#ifndef _CRT_NO_TIME_T 45 struct timespec 46 { 47 time_t tv_sec; // Seconds - >= 0 48 long tv_nsec; // Nanoseconds - [0, 999999999] 49 }; 50#endif 51 52 53 54// The number of clock ticks per second 55#define CLOCKS_PER_SEC ((clock_t)1000) 56 57#define TIME_UTC 1 58 59 60 61//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 62// 63// Time Zone and Daylight Savings Time Data and Accessors 64// 65//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 66// Nonzero if Daylight Savings Time is used 67_Check_return_ _CRT_INSECURE_DEPRECATE_GLOBALS(_get_daylight) 68_ACRTIMP int* __cdecl __daylight(void); 69 70#define _daylight (*__daylight()) 71 72// Offset for Daylight Savings Time 73_Check_return_ _CRT_INSECURE_DEPRECATE_GLOBALS(_get_dstbias) 74_ACRTIMP long* __cdecl __dstbias(void); 75 76#define _dstbias (*__dstbias()) 77 78// Difference in seconds between GMT and local time 79_Check_return_ _CRT_INSECURE_DEPRECATE_GLOBALS(_get_timezone) 80_ACRTIMP long* __cdecl __timezone(void); 81 82#define _timezone (*__timezone()) 83 84// Standard and Daylight Savings Time time zone names 85_Check_return_ _Deref_ret_z_ _CRT_INSECURE_DEPRECATE_GLOBALS(_get_tzname) 86_ACRTIMP char** __cdecl __tzname(void); 87 88#define _tzname (__tzname()) 89 90 _Success_(_Daylight != 0) 91_ACRTIMP errno_t __cdecl _get_daylight( 92 _Out_ int* _Daylight 93 ); 94 95_Success_(_DaylightSavingsBias != 0) 96_ACRTIMP errno_t __cdecl _get_dstbias( 97 _Out_ long* _DaylightSavingsBias 98 ); 99 100 _Success_(_TimeZone != 0) 101_ACRTIMP errno_t __cdecl _get_timezone( 102 _Out_ long* _TimeZone 103 ); 104 105_Success_(return == 0) 106_ACRTIMP errno_t __cdecl _get_tzname( 107 _Out_ size_t* _ReturnValue, 108 _Out_writes_z_(_SizeInBytes) char* _Buffer, 109 _In_ size_t _SizeInBytes, 110 _In_ int _Index 111 ); 112 113 114 115//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 116// 117// AppCRT Time Functions 118// 119//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 120_Success_(return != 0) 121_Ret_writes_z_(26) 122_Check_return_ _CRT_INSECURE_DEPRECATE(asctime_s) 123_ACRTIMP char* __cdecl asctime( 124 _In_ struct tm const* _Tm 125 ); 126 127#if __STDC_WANT_SECURE_LIB__ 128 _Success_(return == 0) 129 _Check_return_wat_ 130 _ACRTIMP errno_t __cdecl asctime_s( 131 _Out_writes_(_SizeInBytes) _Post_readable_size_(26) char* _Buffer, 132 _In_range_(>=,26) size_t _SizeInBytes, 133 _In_ struct tm const* _Tm 134 ); 135#endif 136 137__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1( 138 errno_t, asctime_s, 139 _Post_readable_size_(26) char, _Buffer, 140 _In_ struct tm const*, _Time 141 ) 142 143_Check_return_ 144_ACRTIMP clock_t __cdecl clock(void); 145 146_Ret_z_ 147_Success_(return != 0) 148_Check_return_ _CRT_INSECURE_DEPRECATE(_ctime32_s) 149_ACRTIMP char* __cdecl _ctime32( 150 _In_ __time32_t const* _Time 151 ); 152 153_Check_return_wat_ 154_ACRTIMP errno_t __cdecl _ctime32_s( 155 _Out_writes_(_SizeInBytes) _Post_readable_size_(26) char* _Buffer, 156 _In_range_(>=,26) size_t _SizeInBytes, 157 _In_ __time32_t const* _Time 158 ); 159 160__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1( 161 errno_t, _ctime32_s, 162 _Post_readable_size_(26) char, _Buffer, 163 _In_ __time32_t const*, _Time 164 ) 165 166_Ret_z_ 167_Success_(return != 0) 168_Check_return_ _CRT_INSECURE_DEPRECATE(_ctime64_s) 169_ACRTIMP char* __cdecl _ctime64( 170 _In_ __time64_t const* _Time 171 ); 172 173_Check_return_wat_ 174_ACRTIMP errno_t __cdecl _ctime64_s( 175 _Out_writes_z_(_SizeInBytes) _Post_readable_size_(26) char* _Buffer, 176 _In_range_(>=,26) size_t _SizeInBytes, 177 _In_ __time64_t const* _Time 178 ); 179 180__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1( 181 errno_t, _ctime64_s, 182 _Post_readable_size_(26) char, _Buffer, 183 _In_ __time64_t const*, _Time 184 ) 185 186_Check_return_ 187_ACRTIMP double __cdecl _difftime32( 188 _In_ __time32_t _Time1, 189 _In_ __time32_t _Time2 190 ); 191 192_Check_return_ 193_ACRTIMP double __cdecl _difftime64( 194 _In_ __time64_t _Time1, 195 _In_ __time64_t _Time2 196 ); 197 198_Success_(return != 0) 199_Check_return_ _CRT_INSECURE_DEPRECATE(_gmtime32_s) 200_ACRTIMP struct tm* __cdecl _gmtime32( 201 _In_ __time32_t const* _Time 202 ); 203 204_Check_return_wat_ 205_ACRTIMP errno_t __cdecl _gmtime32_s( 206 _Out_ struct tm* _Tm, 207 _In_ __time32_t const* _Time 208 ); 209 210_Success_(return != 0) 211_Check_return_ _CRT_INSECURE_DEPRECATE(_gmtime64_s) 212_ACRTIMP struct tm* __cdecl _gmtime64( 213 _In_ __time64_t const* _Time 214 ); 215 216_Check_return_wat_ 217_ACRTIMP errno_t __cdecl _gmtime64_s( 218 _Out_ struct tm* _Tm, 219 _In_ __time64_t const* _Time 220 ); 221 222_Success_(return != 0) 223_Check_return_ _CRT_INSECURE_DEPRECATE(_localtime32_s) 224_ACRTIMP struct tm* __cdecl _localtime32( 225 _In_ __time32_t const* _Time 226 ); 227 228_Check_return_wat_ 229_ACRTIMP errno_t __cdecl _localtime32_s( 230 _Out_ struct tm* _Tm, 231 _In_ __time32_t const* _Time 232 ); 233 234_Success_(return != 0) 235_Check_return_ _CRT_INSECURE_DEPRECATE(_localtime64_s) 236_ACRTIMP struct tm* __cdecl _localtime64( 237 _In_ __time64_t const* _Time 238 ); 239 240_Check_return_wat_ 241_ACRTIMP errno_t __cdecl _localtime64_s( 242 _Out_ struct tm* _Tm, 243 _In_ __time64_t const* _Time 244 ); 245 246_Check_return_ 247_ACRTIMP __time32_t __cdecl _mkgmtime32( 248 _Inout_ struct tm* _Tm 249 ); 250 251_Check_return_ 252_ACRTIMP __time64_t __cdecl _mkgmtime64( 253 _Inout_ struct tm* _Tm 254 ); 255 256_Check_return_opt_ 257_ACRTIMP __time32_t __cdecl _mktime32( 258 _Inout_ struct tm* _Tm 259 ); 260 261_Check_return_opt_ 262_ACRTIMP __time64_t __cdecl _mktime64( 263 _Inout_ struct tm* _Tm 264 ); 265 266_Success_(return > 0) 267_Check_return_wat_ 268_ACRTIMP size_t __cdecl strftime( 269 _Out_writes_z_(_SizeInBytes) char* _Buffer, 270 _In_ size_t _SizeInBytes, 271 _In_z_ _Printf_format_string_ char const* _Format, 272 _In_ struct tm const* _Tm 273 ); 274 275_Success_(return > 0) 276_Check_return_wat_ 277_ACRTIMP size_t __cdecl _strftime_l( 278 _Out_writes_z_(_MaxSize) char* _Buffer, 279 _In_ size_t _MaxSize, 280 _In_z_ _Printf_format_string_ char const* _Format, 281 _In_ struct tm const* _Tm, 282 _In_opt_ _locale_t _Locale 283 ); 284 285_Check_return_wat_ 286_ACRTIMP errno_t __cdecl _strdate_s( 287 _Out_writes_(_SizeInBytes) _When_(_SizeInBytes >=9, _Post_readable_size_(9)) char* _Buffer, 288 _In_ size_t _SizeInBytes 289 ); 290 291__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_0( 292 errno_t, _strdate_s, 293 _Post_readable_size_(9) char, _Buffer 294 ) 295 296__DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_0( 297 _Success_(return != 0) char*, __RETURN_POLICY_DST, _ACRTIMP, _strdate, 298 _Out_writes_z_(9), char, _Buffer 299 ) 300 301_Check_return_wat_ 302_ACRTIMP errno_t __cdecl _strtime_s( 303 _Out_writes_(_SizeInBytes) _When_(_SizeInBytes >=9, _Post_readable_size_(9)) char* _Buffer, 304 _In_ size_t _SizeInBytes 305 ); 306 307__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_0( 308 errno_t, _strtime_s, 309 _Post_readable_size_(9) char, _Buffer 310 ) 311 312__DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_0( 313 char*, __RETURN_POLICY_DST, _ACRTIMP, _strtime, 314 _Out_writes_z_(9), char, _Buffer 315 ) 316 317_ACRTIMP __time32_t __cdecl _time32( 318 _Out_opt_ __time32_t* _Time 319 ); 320 321_ACRTIMP __time64_t __cdecl _time64( 322 _Out_opt_ __time64_t* _Time 323 ); 324 325_Success_(return != 0) 326_Check_return_ 327_ACRTIMP int __cdecl _timespec32_get( 328 _Out_ struct _timespec32* _Ts, 329 _In_ int _Base 330 ); 331 332_Success_(return != 0) 333_Check_return_ 334_ACRTIMP int __cdecl _timespec64_get( 335 _Out_ struct _timespec64* _Ts, 336 _In_ int _Base 337 ); 338 339 340 341//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 342// 343// DesktopCRT Time Functions 344// 345//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 346#ifdef _CRT_USE_WINAPI_FAMILY_DESKTOP_APP 347 348 _ACRTIMP void __cdecl _tzset(void); 349 350 // The Win32 API GetLocalTime and SetLocalTime should be used instead. 351 _CRT_OBSOLETE(GetLocalTime) 352 _DCRTIMP unsigned __cdecl _getsystime( 353 _Out_ struct tm* _Tm 354 ); 355 356 _CRT_OBSOLETE(SetLocalTime) 357 _DCRTIMP unsigned __cdecl _setsystime( 358 _In_ struct tm* _Tm, 359 _In_ unsigned _Milliseconds 360 ); 361 362#endif 363 364 365 366//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 367// 368// Inline Function Definitions 369// 370//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 371#if !defined RC_INVOKED && !defined __midl && !defined _INC_TIME_INL && !defined _CRT_NO_TIME_T 372 373 #ifdef _USE_32BIT_TIME_T 374 375 _Check_return_ _CRT_INSECURE_DEPRECATE(ctime_s) 376 static __inline char* __CRTDECL ctime( 377 _In_ time_t const* const _Time 378 ) 379 { 380 return _ctime32(_Time); 381 } 382 383 _Check_return_ 384 static __inline double __CRTDECL difftime( 385 _In_ time_t const _Time1, 386 _In_ time_t const _Time2 387 ) 388 { 389 return _difftime32(_Time1, _Time2); 390 } 391 392 _Check_return_ _CRT_INSECURE_DEPRECATE(gmtime_s) 393 static __inline struct tm* __CRTDECL gmtime( 394 _In_ time_t const* const _Time 395 ) 396 { 397 return _gmtime32(_Time); 398 } 399 400 _Check_return_ _CRT_INSECURE_DEPRECATE(localtime_s) 401 static __inline struct tm* __CRTDECL localtime( 402 _In_ time_t const* const _Time 403 ) 404 { 405 return _localtime32(_Time); 406 } 407 408 _Check_return_ 409 static __inline time_t __CRTDECL _mkgmtime( 410 _Inout_ struct tm* const _Tm 411 ) 412 { 413 return _mkgmtime32(_Tm); 414 } 415 416 _Check_return_opt_ 417 static __inline time_t __CRTDECL mktime( 418 _Inout_ struct tm* const _Tm 419 ) 420 { 421 return _mktime32(_Tm); 422 } 423 424 static __inline time_t __CRTDECL time( 425 _Out_opt_ time_t* const _Time 426 ) 427 { 428 return _time32(_Time); 429 } 430 431 _Check_return_ 432 static __inline int __CRTDECL timespec_get( 433 _Out_ struct timespec* const _Ts, 434 _In_ int const _Base 435 ) 436 { 437 return _timespec32_get((struct _timespec32*)_Ts, _Base); 438 } 439 440 #if __STDC_WANT_SECURE_LIB__ 441 _Check_return_wat_ 442 static __inline errno_t __CRTDECL ctime_s( 443 _Out_writes_(_SizeInBytes) _Post_readable_size_(26) char* const _Buffer, 444 _In_range_(>=,26) size_t const _SizeInBytes, 445 _In_ time_t const* const _Time 446 ) 447 { 448 return _ctime32_s(_Buffer, _SizeInBytes, _Time); 449 } 450 451 #if _CRT_USE_CONFORMING_ANNEX_K_TIME 452 _Check_return_wat_ 453 static __inline struct tm* __CRTDECL gmtime_s( 454 _In_ time_t const* const _Time, 455 _Out_ struct tm* const _Tm 456 ) 457 { 458 if (_gmtime32_s(_Tm, _Time) == 0) 459 { 460 return _Tm; 461 } 462 return NULL; 463 } 464 465 _Check_return_wat_ 466 static __inline struct tm* __CRTDECL localtime_s( 467 _In_ time_t const* const _Time, 468 _Out_ struct tm* const _Tm 469 ) 470 { 471 if (_localtime32_s(_Tm, _Time) == 0) 472 { 473 return _Tm; 474 } 475 return NULL; 476 } 477 #else // _CRT_USE_CONFORMING_ANNEX_K_TIME 478 _Check_return_wat_ 479 static __inline errno_t __CRTDECL gmtime_s( 480 _Out_ struct tm* const _Tm, 481 _In_ time_t const* const _Time 482 ) 483 { 484 return _gmtime32_s(_Tm, _Time); 485 } 486 487 _Check_return_wat_ 488 static __inline errno_t __CRTDECL localtime_s( 489 _Out_ struct tm* const _Tm, 490 _In_ time_t const* const _Time 491 ) 492 { 493 return _localtime32_s(_Tm, _Time); 494 } 495 #endif // _CRT_USE_CONFORMING_ANNEX_K_TIME 496 #endif 497 498 #else // ^^^ _USE_32BIT_TIME_T ^^^ // vvv !_USE_32BIT_TIME_T vvv 499 500 _Check_return_ _CRT_INSECURE_DEPRECATE(ctime_s) 501 static __inline char* __CRTDECL ctime( 502 _In_ time_t const* const _Time 503 ) 504 { 505 return _ctime64(_Time); 506 } 507 508 _Check_return_ 509 static __inline double __CRTDECL difftime( 510 _In_ time_t const _Time1, 511 _In_ time_t const _Time2 512 ) 513 { 514 return _difftime64(_Time1, _Time2); 515 } 516 517 _Check_return_ _CRT_INSECURE_DEPRECATE(gmtime_s) 518 static __inline struct tm* __CRTDECL gmtime( 519 _In_ time_t const* const _Time) 520 { 521 return _gmtime64(_Time); 522 } 523 524 _CRT_INSECURE_DEPRECATE(localtime_s) 525 static __inline struct tm* __CRTDECL localtime( 526 _In_ time_t const* const _Time 527 ) 528 { 529 return _localtime64(_Time); 530 } 531 532 _Check_return_ 533 static __inline time_t __CRTDECL _mkgmtime( 534 _Inout_ struct tm* const _Tm 535 ) 536 { 537 return _mkgmtime64(_Tm); 538 } 539 540 _Check_return_opt_ 541 static __inline time_t __CRTDECL mktime( 542 _Inout_ struct tm* const _Tm 543 ) 544 { 545 return _mktime64(_Tm); 546 } 547 548 static __inline time_t __CRTDECL time( 549 _Out_opt_ time_t* const _Time 550 ) 551 { 552 return _time64(_Time); 553 } 554 555 _Check_return_ 556 static __inline int __CRTDECL timespec_get( 557 _Out_ struct timespec* const _Ts, 558 _In_ int const _Base 559 ) 560 { 561 return _timespec64_get((struct _timespec64*)_Ts, _Base); 562 } 563 564 #if __STDC_WANT_SECURE_LIB__ 565 _Check_return_wat_ 566 static __inline errno_t __CRTDECL ctime_s( 567 _Out_writes_(_SizeInBytes) _Post_readable_size_(26) char* const _Buffer, 568 _In_range_(>=,26) size_t const _SizeInBytes, 569 _In_ time_t const* const _Time 570 ) 571 { 572 return _ctime64_s(_Buffer, _SizeInBytes, _Time); 573 } 574 575 #if _CRT_USE_CONFORMING_ANNEX_K_TIME 576 _Check_return_wat_ 577 static __inline struct tm* __CRTDECL gmtime_s( 578 _In_ time_t const* const _Time, 579 _Out_ struct tm* const _Tm 580 ) 581 { 582 if (_gmtime64_s(_Tm, _Time) == 0) 583 { 584 return _Tm; 585 } 586 return NULL; 587 } 588 589 _Check_return_wat_ 590 static __inline struct tm* __CRTDECL localtime_s( 591 _In_ time_t const* const _Time, 592 _Out_ struct tm* const _Tm 593 ) 594 { 595 if (_localtime64_s(_Tm, _Time) == 0) 596 { 597 return _Tm; 598 } 599 return NULL; 600 } 601 #else // _CRT_USE_CONFORMING_ANNEX_K_TIME 602 _Check_return_wat_ 603 static __inline errno_t __CRTDECL gmtime_s( 604 _Out_ struct tm* const _Tm, 605 _In_ time_t const* const _Time 606 ) 607 { 608 return _gmtime64_s(_Tm, _Time); 609 } 610 611 _Check_return_wat_ 612 static __inline errno_t __CRTDECL localtime_s( 613 _Out_ struct tm* const _Tm, 614 _In_ time_t const* const _Time 615 ) 616 { 617 return _localtime64_s(_Tm, _Time); 618 } 619 #endif // _CRT_USE_CONFORMING_ANNEX_K_TIME 620 #endif 621 622 #endif // !_USE_32BIT_TIME_T 623 624#endif 625 626 627 628//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 629// 630// Non-ANSI Names for Compatibility 631// 632//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 633#if defined(_CRT_INTERNAL_NONSTDC_NAMES) && _CRT_INTERNAL_NONSTDC_NAMES 634 635 #define CLK_TCK CLOCKS_PER_SEC 636 637 #ifdef _CRT_USE_WINAPI_FAMILY_DESKTOP_APP 638 _CRT_NONSTDC_DEPRECATE(_tzset) _ACRTIMP void __cdecl tzset(void); 639 #endif 640 641#endif // _CRT_INTERNAL_NONSTDC_NAMES 642 643 644 645_CRT_END_C_HEADER 646_UCRT_RESTORE_CLANG_WARNINGS 647#pragma warning(pop) // _UCRT_DISABLED_WARNINGS 648#endif // _INC_TIME