| 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 |
nothing calls this directly
no outgoing calls
no test coverage detected