Rev 4921 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4921 | Rev 6099 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* |
1 | /* |
2 | * localtime_r.c |
2 | * localtime_r.c |
- | 3 | * Original Author: Adapted from tzcode maintained by Arthur David Olson. |
|
- | 4 | * Modifications: |
|
- | 5 | * - Changed to mktm_r and added __tzcalc_limits - 04/10/02, Jeff Johnston |
|
- | 6 | * - Fixed bug in mday computations - 08/12/04, Alex Mogilnikov |
|
- | 7 | * - Fixed bug in __tzcalc_limits - 08/12/04, Alex Mogilnikov |
|
- | 8 | * - Implement localtime_r() with gmtime_r() and the conditional code moved |
|
- | 9 | * from _mktm_r() - 05/09/14, Freddie Chopin |
|
3 | * |
10 | * |
4 | * Converts the calendar time pointed to by tim_p into a broken-down time |
11 | * Converts the calendar time pointed to by tim_p into a broken-down time |
5 | * expressed as local time. Returns a pointer to a structure containing the |
12 | * expressed as local time. Returns a pointer to a structure containing the |
6 | * broken-down time. |
13 | * broken-down time. |
7 | */ |
14 | */ |
Line 8... | Line -... | ||
8 | - | ||
9 | #include |
15 | |
Line 10... | Line 16... | ||
10 | #include "local.h" |
16 | #include "local.h" |
11 | 17 | ||
12 | struct tm * |
18 | struct tm * |
13 | _DEFUN (localtime_r, (tim_p, res), |
19 | _DEFUN (localtime_r, (tim_p, res), |
14 | _CONST time_t *__restrict tim_p _AND |
20 | _CONST time_t *__restrict tim_p _AND |
- | 21 | struct tm *__restrict res) |
|
- | 22 | { |
|
- | 23 | long offset; |
|
- | 24 | int hours, mins, secs; |
|
- | 25 | int year; |
|
- | 26 | __tzinfo_type *_CONST tz = __gettzinfo (); |
|
15 | struct tm *__restrict res) |
27 | _CONST int *ip; |
- | 28 | ||
- | 29 | res = gmtime_r (tim_p, res); |
|
- | 30 | ||
- | 31 | year = res->tm_year + YEAR_BASE; |
|
- | 32 | ip = __month_lengths[isleap(year)]; |
|
- | 33 | ||
- | 34 | TZ_LOCK; |
|
- | 35 | _tzset_unlocked (); |
|
- | 36 | if (_daylight) |
|
- | 37 | { |
|
- | 38 | if (year == tz->__tzyear || __tzcalc_limits (year)) |
|
- | 39 | res->tm_isdst = (tz->__tznorth |
|
- | 40 | ? (*tim_p >= tz->__tzrule[0].change |
|
- | 41 | && *tim_p < tz->__tzrule[1].change) |
|
- | 42 | : (*tim_p >= tz->__tzrule[0].change |
|
- | 43 | || *tim_p < tz->__tzrule[1].change)); |
|
- | 44 | else |
|
- | 45 | res->tm_isdst = -1; |
|
- | 46 | } |
|
- | 47 | else |
|
- | 48 | res->tm_isdst = 0; |
|
- | 49 | ||
- | 50 | offset = (res->tm_isdst == 1 |
|
- | 51 | ? tz->__tzrule[1].offset |
|
- | 52 | : tz->__tzrule[0].offset); |
|
- | 53 | ||
- | 54 | hours = (int) (offset / SECSPERHOUR); |
|
- | 55 | offset = offset % SECSPERHOUR; |
|
- | 56 | ||
- | 57 | mins = (int) (offset / SECSPERMIN); |
|
- | 58 | secs = (int) (offset % SECSPERMIN); |
|
- | 59 | ||
- | 60 | res->tm_sec -= secs; |
|
- | 61 | res->tm_min -= mins; |
|
- | 62 | res->tm_hour -= hours; |
|
- | 63 | ||
- | 64 | if (res->tm_sec >= SECSPERMIN) |
|
- | 65 | { |
|
- | 66 | res->tm_min += 1; |
|
- | 67 | res->tm_sec -= SECSPERMIN; |
|
- | 68 | } |
|
- | 69 | else if (res->tm_sec < 0) |
|
- | 70 | { |
|
- | 71 | res->tm_min -= 1; |
|
- | 72 | res->tm_sec += SECSPERMIN; |
|
- | 73 | } |
|
- | 74 | if (res->tm_min >= MINSPERHOUR) |
|
- | 75 | { |
|
- | 76 | res->tm_hour += 1; |
|
- | 77 | res->tm_min -= MINSPERHOUR; |
|
- | 78 | } |
|
- | 79 | else if (res->tm_min < 0) |
|
- | 80 | { |
|
- | 81 | res->tm_hour -= 1; |
|
- | 82 | res->tm_min += MINSPERHOUR; |
|
- | 83 | } |
|
- | 84 | if (res->tm_hour >= HOURSPERDAY) |
|
- | 85 | { |
|
- | 86 | ++res->tm_yday; |
|
- | 87 | ++res->tm_wday; |
|
- | 88 | if (res->tm_wday > 6) |
|
- | 89 | res->tm_wday = 0; |
|
- | 90 | ++res->tm_mday; |
|
- | 91 | res->tm_hour -= HOURSPERDAY; |
|
- | 92 | if (res->tm_mday > ip[res->tm_mon]) |
|
- | 93 | { |
|
- | 94 | res->tm_mday -= ip[res->tm_mon]; |
|
- | 95 | res->tm_mon += 1; |
|
- | 96 | if (res->tm_mon == 12) |
|
- | 97 | { |
|
- | 98 | res->tm_mon = 0; |
|
- | 99 | res->tm_year += 1; |
|
- | 100 | res->tm_yday = 0; |
|
- | 101 | } |
|
- | 102 | } |
|
- | 103 | } |
|
- | 104 | else if (res->tm_hour < 0) |
|
- | 105 | { |
|
- | 106 | res->tm_yday -= 1; |
|
- | 107 | res->tm_wday -= 1; |
|
- | 108 | if (res->tm_wday < 0) |
|
- | 109 | res->tm_wday = 6; |
|
- | 110 | res->tm_mday -= 1; |
|
- | 111 | res->tm_hour += 24; |
|
- | 112 | if (res->tm_mday == 0) |
|
- | 113 | { |
|
- | 114 | res->tm_mon -= 1; |
|
- | 115 | if (res->tm_mon < 0) |
|
- | 116 | { |
|
- | 117 | res->tm_mon = 11; |
|
- | 118 | res->tm_year -= 1; |
|
- | 119 | res->tm_yday = 364 + isleap(res->tm_year + YEAR_BASE); |
|
- | 120 | } |
|
- | 121 | res->tm_mday = ip[res->tm_mon]; |
|
- | 122 | } |
|
- | 123 | } |
|
- | 124 | TZ_UNLOCK; |
|
16 | { |
125 |