619a7009b533300c197fc84e5e40f0b3368a5823
2 * COPYRIGHT: LGPL, See LGPL.txt in the top level directory
3 * PROJECT: ReactOS CRT library
4 * FILE: lib/sdk/crt/time/mktime.c
5 * PURPOSE: Implementation of mktime, _mkgmtime
6 * PROGRAMERS: Timo Kreuzer
11 #define MAX_32BIT_TIME 0xFFFFFFFFULL
13 static int g_monthdays
[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
16 mktime_worker(struct tm
* ptm
, int utc
)
20 int mons
, years
, leapyears
;
22 /* Normalize year and month */
25 mons
= -ptm
->tm_mon
- 1;
26 ptm
->tm_year
-= 1 + mons
/ 12;
27 ptm
->tm_mon
= 11 - (mons
% 12);
29 else if (ptm
->tm_mon
> 11)
32 ptm
->tm_year
+= (mons
/ 12);
33 ptm
->tm_mon
= mons
% 12;
36 /* Is it inside margins */
37 if (ptm
->tm_year
< 70 || ptm
->tm_year
> 139) // FIXME: max year for 64 bits
42 years
= ptm
->tm_year
- 70;
44 /* Number of leapyears passed since 1970 */
45 leapyears
= (years
+ 1) / 4;
47 /* Calculate days up to 1st of Jan */
48 time
= years
* 365 + leapyears
;
50 /* Calculate days up to 1st of month */
51 time
+= g_monthdays
[ptm
->tm_mon
];
53 /* Check if we need to add a leap day */
54 if (((years
+ 2) % 4) == 0)
62 time
+= ptm
->tm_mday
- 1;
78 /* Finally get normalized tm struct */
79 ptm2
= _gmtime64(&time
);
86 /* Finally adjust by the difference to GMT in seconds */
108 _mkgmtime(struct tm
*ptm
)
110 time_t time
= mktime_worker(ptm
, 1);
111 return (time
> MAX_32BIT_TIME
) ? -1 : time
;
115 mktime(struct tm
*ptm
)
117 time_t time
= mktime_worker(ptm
, 0);
118 return (time
> MAX_32BIT_TIME
) ? -1 : time
;
122 _mkgmtime32(struct tm
*ptm
)
124 time_t time
= mktime_worker(ptm
, 1);
125 return (time
> MAX_32BIT_TIME
) ? -1 : time
;
129 _mktime32(struct tm
*ptm
)
131 time_t time
= mktime_worker(ptm
, 0);
132 return (time
> MAX_32BIT_TIME
) ? -1 : time
;
136 _mkgmtime64(struct tm
*ptm
)
138 return mktime_worker(ptm
, 1);
142 _mktime64(struct tm
*ptm
)
144 return mktime_worker(ptm
, 0);