...
This commit is contained in:
@@ -170,6 +170,7 @@ struct leapsecond_db_elem_t {
|
||||
double mjd;
|
||||
unsigned day, month;
|
||||
int year;
|
||||
// std::chrono::year_month_day ymd;
|
||||
double tai_utc; // TAI-UTC in seconds
|
||||
};
|
||||
|
||||
@@ -209,11 +210,11 @@ static leapsecond_db_t CURRENT_LEAPSECONDS_DB = {
|
||||
|
||||
static earth_orient_db_t CURRENT_EARTH_ORIENT_DB;
|
||||
|
||||
bool mcc_parse_bulletinA(std::derived_from<std::basic_istream<char>> auto& stream, char comment_sym = '*')
|
||||
static bool mcc_parse_bulletinA(std::derived_from<std::basic_istream<char>> auto& stream, char comment_sym = '*')
|
||||
{
|
||||
const std::regex bull_date_rx{
|
||||
"^ *[0-9]{1,2} +(January|Febraury|March|April|May|June|July|August|September|October|November|December) "
|
||||
"+[0-9]{4,} + Vol\\.[XMLCDVI]+ +No\\. +[0-9]+ *$"};
|
||||
"^ *[0-9]{1,2} +(January|February|March|April|May|June|July|August|September|October|November|December) "
|
||||
"+[0-9]{4,} +Vol\\. +[XMLCDVI]+ +No\\. +[0-9]+ *$"};
|
||||
|
||||
const std::regex bull_tab_title_rx{"^ *MJD +x\\(arcsec\\) +y\\(arcsec\\) +UT1-UTC\\(sec\\) *$"};
|
||||
|
||||
@@ -235,7 +236,7 @@ bool mcc_parse_bulletinA(std::derived_from<std::basic_istream<char>> auto& strea
|
||||
continue;
|
||||
}
|
||||
|
||||
auto sv = utils::trimSpaces(line, utils::TrimType::TRIM_BOTH);
|
||||
auto sv = utils::trimSpaces(line, utils::TrimType::TRIM_LEFT);
|
||||
|
||||
if (sv.size()) {
|
||||
if (sv[0] == comment_sym) { // comment string
|
||||
@@ -244,9 +245,11 @@ bool mcc_parse_bulletinA(std::derived_from<std::basic_istream<char>> auto& strea
|
||||
|
||||
if (tab_state == TAB_STATE_START) {
|
||||
if (std::regex_match(sv.begin(), sv.end(), bull_tab_vals_rx)) {
|
||||
is.str({sv.begin(), sv.end()});
|
||||
// is.str({sv.begin(), sv.end()});
|
||||
is.str(line);
|
||||
is >> year >> month >> day >> mjd >> x >> y >> dut1;
|
||||
db.db.emplace_back(year, month, day, mjd, x, y, dut1);
|
||||
is.clear();
|
||||
} else { // end of the table - just stop parsing
|
||||
break;
|
||||
}
|
||||
@@ -280,22 +283,27 @@ bool mcc_parse_bulletinA(std::derived_from<std::basic_istream<char>> auto& strea
|
||||
}
|
||||
|
||||
|
||||
bool mcc_parse_leapsecs(std::derived_from<std::basic_istream<char>> auto& stream, char comment_sym = '#')
|
||||
static bool mcc_parse_leapsecs(std::derived_from<std::basic_istream<char>> auto& stream, char comment_sym = '#')
|
||||
{
|
||||
size_t n;
|
||||
std::optional<double> vd;
|
||||
std::optional<unsigned> vui;
|
||||
std::optional<int> vi;
|
||||
// # File expires on 28 December 2025
|
||||
const std::regex expr_date_rx{
|
||||
"^ *# *File +expires +on +[0-8]{1,2} "
|
||||
"+(January|February|March|April|May|June|July|August|September|October|November|December) +[0-9]{4} *$"};
|
||||
|
||||
const std::regex data_rx{"^ *[0-9]{5,}(\\.?[0-9]+) +[0-9]{1,2} +[0-9]{1,2} +[0-9]{4} +[0-9]{1,} *$"};
|
||||
|
||||
std::istringstream is;
|
||||
double mjd;
|
||||
unsigned day, month;
|
||||
int year;
|
||||
double tai_utc;
|
||||
|
||||
|
||||
leapsecond_db_t db;
|
||||
leapsecond_db_elem_t db_elem;
|
||||
// leapsecond_db_elem_t db_elem;
|
||||
|
||||
for (std::string line; std::getline(stream, line);) {
|
||||
if (line.empty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto sv = utils::trimSpaces(line, utils::TrimType::TRIM_BOTH);
|
||||
auto sv = utils::trimSpaces(line, utils::TrimType::TRIM_LEFT);
|
||||
|
||||
if (sv.size()) {
|
||||
if (sv[0] == comment_sym) { // comment string
|
||||
@@ -305,65 +313,16 @@ bool mcc_parse_leapsecs(std::derived_from<std::basic_istream<char>> auto& stream
|
||||
continue;
|
||||
}
|
||||
|
||||
n = 0;
|
||||
for (auto const& el : std::views::split(sv, std::string_view(" "))) {
|
||||
if (std::ranges::size(el) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (n) {
|
||||
case 0:
|
||||
vd = utils::numFromStr<double>(el);
|
||||
if (!vd) {
|
||||
return false;
|
||||
}
|
||||
db_elem.mjd = vd.value();
|
||||
break;
|
||||
case 1:
|
||||
vui = utils::numFromStr<unsigned>(el);
|
||||
if (!vui) {
|
||||
return false;
|
||||
}
|
||||
db_elem.day = vui.value();
|
||||
break;
|
||||
case 2:
|
||||
vui = utils::numFromStr<unsigned>(el);
|
||||
if (!vui) {
|
||||
return false;
|
||||
}
|
||||
db_elem.month = vui.value();
|
||||
break;
|
||||
case 3:
|
||||
vi = utils::numFromStr<int>(el);
|
||||
if (!vi) {
|
||||
return false;
|
||||
}
|
||||
db_elem.year = vi.value();
|
||||
break;
|
||||
case 4:
|
||||
vd = utils::numFromStr<double>(el);
|
||||
if (!vd) {
|
||||
return false;
|
||||
}
|
||||
db_elem.tai_utc = vd.value();
|
||||
break;
|
||||
default:
|
||||
// just ignore??!!!
|
||||
break;
|
||||
}
|
||||
|
||||
++n;
|
||||
|
||||
if (n == 5) {
|
||||
break;
|
||||
}
|
||||
if (std::regex_match(line, data_rx)) {
|
||||
is.str(std::move(line));
|
||||
is >> mjd >> day >> month >> year >> tai_utc;
|
||||
db.emplace_back(mjd, day, month, year, tai_utc);
|
||||
is.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 5) { // not enough elements
|
||||
return false;
|
||||
}
|
||||
|
||||
db.emplace_back(std::move(db_elem));
|
||||
if (db.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CURRENT_LEAPSECONDS_DB = std::move(db);
|
||||
@@ -371,4 +330,6 @@ bool mcc_parse_leapsecs(std::derived_from<std::basic_istream<char>> auto& stream
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace mcc::astro
|
||||
|
||||
Reference in New Issue
Block a user