uint32_t caltontp( const struct calendar *jt ) { int32_t eraday; /* CE Rata Die number */ vint64 ntptime;/* resulting NTP time */ NTP_INSIST(jt != NULL); NTP_REQUIRE(jt->month <= 13); /* permit month 0..13! */ NTP_REQUIRE(jt->monthday <= 32); NTP_REQUIRE(jt->yearday <= 366); NTP_REQUIRE(jt->hour <= 24); NTP_REQUIRE(jt->minute <= MINSPERHR); NTP_REQUIRE(jt->second <= SECSPERMIN); /* * First convert the date to he corresponding RataDie * number. If yearday is not zero, assume that it contains a * useable value and avoid all calculations involving month * and day-of-month. Do a full evaluation otherwise. */ if (jt->yearday) eraday = ntpcal_year_to_ystart(jt->year) + jt->yearday - 1; else eraday = ntpcal_date_to_rd(jt); ntptime = ntpcal_dayjoin(eraday - DAY_NTP_STARTS, ntpcal_etime_to_seconds(jt->hour, jt->minute, jt->second)); return ntptime.d_s.lo; }
/* test the day/sec join & split ops, making sure that 32bit * intermediate results would definitely overflow and the hi DWORD of * the 'vint64' is definitely needed. */ void test_DaySplitMerge(void) { int32 day,sec; for (day = -1000000; day <= 1000000; day += 100) { for (sec = -100000; sec <= 186400; sec += 10000) { vint64 merge; ntpcal_split split; int32 eday; int32 esec; merge = ntpcal_dayjoin(day, sec); split = ntpcal_daysplit(&merge); eday = day; esec = sec; while (esec >= 86400) { eday += 1; esec -= 86400; } while (esec < 0) { eday -= 1; esec += 86400; } TEST_ASSERT_EQUAL(eday, split.hi); TEST_ASSERT_EQUAL(esec, split.lo); } } return; }
// test the day/sec join & split ops, making sure that 32bit // intermediate results would definitely overflow and the hi DWORD of // the 'vint64' is definitely needed. TEST_F(calendarTest, DaySplitMerge) { for (int32 day = -1000000; day <= 1000000; day += 100) { for (int32 sec = -100000; sec <= 186400; sec += 10000) { vint64 merge = ntpcal_dayjoin(day, sec); ntpcal_split split = ntpcal_daysplit(&merge); int32 eday = day; int32 esec = sec; while (esec >= 86400) { eday += 1; esec -= 86400; } while (esec < 0) { eday -= 1; esec += 86400; } EXPECT_EQ(eday, split.hi); EXPECT_EQ(esec, split.lo); } } }