MCPcopy Create free account
hub / github.com/KTH-RPL/dufomap / parse_date

Method parse_date

src/toml.hpp:14405–14455  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

14403 TOML_NODISCARD
14404 TOML_NEVER_INLINE
14405 date parse_date(bool part_of_datetime = false)
14406 {
14407 return_if_error({});
14408 assert_not_eof();
14409 TOML_ASSERT_ASSUME(is_decimal_digit(*cp));
14410 push_parse_scope("date"sv);
14411
14412 // "YYYY"
14413 uint32_t digits[4];
14414 if (!consume_digit_sequence(digits, 4u))
14415 set_error_and_return_default("expected 4-digit year, saw '"sv, to_sv(cp), "'"sv);
14416 const auto year = digits[3] + digits[2] * 10u + digits[1] * 100u + digits[0] * 1000u;
14417 const auto is_leap_year = (year % 4u == 0u) && ((year % 100u != 0u) || (year % 400u == 0u));
14418 set_error_and_return_if_eof({});
14419
14420 // '-'
14421 if (*cp != U'-')
14422 set_error_and_return_default("expected '-', saw '"sv, to_sv(*cp), "'"sv);
14423 advance_and_return_if_error_or_eof({});
14424
14425 // "MM"
14426 if (!consume_digit_sequence(digits, 2u))
14427 set_error_and_return_default("expected 2-digit month, saw '"sv, to_sv(cp), "'"sv);
14428 const auto month = digits[1] + digits[0] * 10u;
14429 if (month == 0u || month > 12u)
14430 set_error_and_return_default("expected month between 1 and 12 (inclusive), saw "sv, month);
14431 const auto max_days_in_month = month == 2u
14432 ? (is_leap_year ? 29u : 28u)
14433 : (month == 4u || month == 6u || month == 9u || month == 11u ? 30u : 31u);
14434 set_error_and_return_if_eof({});
14435
14436 // '-'
14437 if (*cp != U'-')
14438 set_error_and_return_default("expected '-', saw '"sv, to_sv(*cp), "'"sv);
14439 advance_and_return_if_error_or_eof({});
14440
14441 // "DD"
14442 if (!consume_digit_sequence(digits, 2u))
14443 set_error_and_return_default("expected 2-digit day, saw '"sv, to_sv(cp), "'"sv);
14444 const auto day = digits[1] + digits[0] * 10u;
14445 if (day == 0u || day > max_days_in_month)
14446 set_error_and_return_default("expected day between 1 and "sv,
14447 max_days_in_month,
14448 " (inclusive), saw "sv,
14449 day);
14450
14451 if (!part_of_datetime && !is_eof() && !is_value_terminator(*cp))
14452 set_error_and_return_default("expected value-terminator, saw '"sv, to_sv(*cp), "'"sv);
14453
14454 return { year, month, day };
14455 }
14456
14457 TOML_NODISCARD
14458 TOML_NEVER_INLINE

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected