void NMEAInfo::ProvideDate(const BrokenDate &date) { assert(date.IsPlausible()); (BrokenDate &)date_time_utc = date; }
static bool IGCParseDate(const char *buffer, BrokenDate &date) { unsigned day, month, year; if (sscanf(buffer, "%02u%02u%02u", &day, &month, &year) != 3) return false; date = BrokenDate(year + 2000, month, day); return date.IsPlausible(); }
bool IGCParseDateRecord(const char *line, BrokenDate &date) { if (memcmp(line, "HFDTE", 5) != 0) return false; line += 5; char *endptr; unsigned long value = strtoul(line, &endptr, 10); if (endptr != line + 6) return false; date.year = 1990 + (value + 10) % 100; /* Y2090 bug! */ date.month = (value / 100) % 100; date.day = value / 10000; return date.IsPlausible(); }
static bool ReadDate(NMEAInputLine &line, BrokenDate &date) { char buffer[16]; line.Read(buffer, sizeof(buffer)); char *p = buffer, *endptr; date.day = strtoul(p, &endptr, 10); if (endptr == p || *endptr != '.') return false; p = endptr + 1; date.month = strtoul(p, &endptr, 10); if (endptr == p || *endptr != '.') return false; p = endptr + 1; date.year = strtoul(p, &endptr, 10); if (endptr == p || *endptr != 0) return false; return date.IsPlausible(); }
static void TestBasic() { WrapClock w; w.Reset(); BrokenDate date = BrokenDate::Invalid(); ok1(equals(Normalise(w, date, 0, 1), 60)); ok1(!date.IsPlausible()); ok1(equals(Normalise(w, date, 12, 0), 12 * 3600)); ok1(!date.IsPlausible()); /* time warp */ ok1(equals(Normalise(w, date, 1, 0), 3600)); ok1(!date.IsPlausible()); /* seek right before midnight and produce a midnight wraparound */ ok1(equals(Normalise(w, date, 23, 50), 23 * 3600 + 50 * 60)); ok1(!date.IsPlausible()); ok1(equals(Normalise(w, date, 0, 10), 24 * 3600 + 10 * 60)); ok1(!date.IsPlausible()); /* .. and another one */ ok1(equals(Normalise(w, date, 23, 50), 47 * 3600 + 50 * 60)); ok1(!date.IsPlausible()); ok1(equals(Normalise(w, date, 0, 10), 48 * 3600 + 10 * 60)); ok1(!date.IsPlausible()); /* inject a valid date */ date = BrokenDate(2013, 5, 14); BrokenDate expected_date = date; ok1(equals(Normalise(w, date, 0, 10), 48 * 3600 + 10 * 60)); ok1(date == expected_date); /* same day */ date = BrokenDate(2013, 5, 14); ok1(equals(Normalise(w, date, 0, 20), 48 * 3600 + 20 * 60)); ok1(date == expected_date); /* next day */ expected_date = date = BrokenDate(2013, 5, 15); ok1(equals(Normalise(w, date, 0, 10), 72 * 3600 + 10 * 60)); ok1(date == expected_date); /* fast-forward 3 days */ expected_date = date = BrokenDate(2013, 5, 18); ok1(equals(Normalise(w, date, 0, 10), 144 * 3600 + 10 * 60)); ok1(date == expected_date); /* back one day */ expected_date = date = BrokenDate(2013, 5, 17); ok1(equals(Normalise(w, date, 0, 10), 10 * 60)); ok1(date == expected_date); /* fast-forward 2 days */ expected_date = date = BrokenDate(2013, 5, 19); ok1(equals(Normalise(w, date, 0, 10), 48 * 3600 + 10 * 60)); ok1(date == expected_date); /* back to invalid date */ date = BrokenDate::Invalid(); ok1(equals(Normalise(w, date, 0, 20), 48 * 3600 + 20 * 60)); ok1(!date.IsPlausible()); /* produce a wraparound and then recover date */ ok1(equals(Normalise(w, date, 23, 50), 71 * 3600 + 50 * 60)); ok1(equals(Normalise(w, date, 0, 10), 72 * 3600 + 10 * 60)); ok1(equals(Normalise(w, date, 0, 20), 72 * 3600 + 20 * 60)); ok1(!date.IsPlausible()); expected_date = date = BrokenDate(2013, 5, 20); ok1(equals(Normalise(w, date, 0, 20), 72 * 3600 + 20 * 60)); ok1(date == expected_date); /* back to invalid date, wraparound and then recover with warped date (resets the WrapClock) */ date = BrokenDate::Invalid(); ok1(equals(Normalise(w, date, 0, 20), 72 * 3600 + 20 * 60)); ok1(equals(Normalise(w, date, 23, 50), 95 * 3600 + 50 * 60)); ok1(equals(Normalise(w, date, 0, 10), 96 * 3600 + 10 * 60)); ok1(!date.IsPlausible()); expected_date = date = BrokenDate(2013, 5, 20); ok1(equals(Normalise(w, date, 0, 20), 20 * 60)); ok1(date == expected_date); /* wrap midnight, but don't increment date - WrapClock must increment the date automatically */ w.Reset(); expected_date = date = BrokenDate(2013, 2, 28); ok1(equals(Normalise(w, date, 23, 55), 23 * 3600 + 55 * 60)); ok1(date == expected_date); expected_date = BrokenDate(2013, 3, 1); ok1(equals(Normalise(w, date, 0, 5), 24 * 3600 + 5 * 60)); ok1(date == expected_date); }