void cavan_time_parse(unsigned long timestamp, struct cavan_time *time, u32 base_days) { u32 year; u32 remain; unsigned long days; const u16 *p, *yday; days = timestamp / CAVAN_TIME_SECONDS_PER_DAY + base_days; time->wday = days % 7; year = days / 366; while (cavan_time_get_days_of_year(year + 1, 0, 1) <= days) { year++; } yday = cavan_time_mon_yday[cavan_time_year_is_leap(year)]; days -= cavan_time_get_days_of_year(year, 0, 1); for (p = yday + 11; *p > days; p--); time->year = year; time->month = p - yday; time->mday = days - *p + 1; time->yday = days; remain = timestamp % CAVAN_TIME_SECONDS_PER_DAY; time->hour = remain / CAVAN_TIME_SECONDS_PER_HOUR; time->minute = remain % CAVAN_TIME_SECONDS_PER_HOUR / CAVAN_TIME_SECONDS_PER_MIN; time->second = timestamp % CAVAN_TIME_SECONDS_PER_MIN; }
u32 cavan_time_get_days_of_year(u32 year, u8 month, u8 day) { u32 days = year * 365 + day; const u16 *yday = cavan_time_mon_yday[cavan_time_year_is_leap(year)]; if (year > 0) { year--; } return year / 4 - year / 100 + year / 400 + yday[month] + days - 1; }