blob: ebcd10d1a4e2313e1acdbaeab9e23c64fa815a65 [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#include <windows.h>
#include <time.h>
#include "filetime_to_time64.h"
static const short int days_in_year[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 };
static struct tm *__cdecl emu__gmtime64(const __time64_t *timeptr)
{
struct tm *tmptr;
FILETIME filetime;
SYSTEMTIME systemtime;
int is_leap_year;
int has_leap_day;
time64_to_filetime(*timeptr, &filetime);
if (!FileTimeToSystemTime(&filetime, &systemtime))
return NULL;
/* retrieve thread local storage for gmtime tm */
tmptr = _gmtime32(&(__time32_t){0});
if (!tmptr)
return NULL;
is_leap_year = ((systemtime.wYear % 4 == 0 && systemtime.wYear % 100 != 0) || systemtime.wYear % 400 == 0);
has_leap_day = (systemtime.wMonth >= 3 && is_leap_year);
tmptr->tm_sec = systemtime.wSecond;
tmptr->tm_min = systemtime.wMinute;
tmptr->tm_hour = systemtime.wHour;
tmptr->tm_mday = systemtime.wDay;
tmptr->tm_mon = systemtime.wMonth - 1;
tmptr->tm_year = systemtime.wYear - 1900;
tmptr->tm_wday = systemtime.wDayOfWeek;
tmptr->tm_yday = days_in_year[tmptr->tm_mon] + systemtime.wDay + (has_leap_day ? 1 : 0);
tmptr->tm_isdst = 0;
return tmptr;
}
#define RETT struct tm *
#define FUNC _gmtime64
#define ARGS const __time64_t *timeptr
#define CALL timeptr
#include "msvcrt_or_emu_glue.h"