diff --git a/wxdata/include/scwx/awips/text_product_message.hpp b/wxdata/include/scwx/awips/text_product_message.hpp index db74304b..358a79ea 100644 --- a/wxdata/include/scwx/awips/text_product_message.hpp +++ b/wxdata/include/scwx/awips/text_product_message.hpp @@ -2,8 +2,9 @@ #include #include -#include #include +#include +#include #include #include @@ -31,13 +32,18 @@ struct Vtec struct SegmentHeader { - std::string ugcString_; + std::vector ugcString_; + Ugc ugc_; std::vector vtecString_; std::vector ugcNames_; std::string issuanceDateTime_; SegmentHeader() : - ugcString_ {}, vtecString_ {}, ugcNames_ {}, issuanceDateTime_ {} + ugcString_ {}, + ugc_ {}, + vtecString_ {}, + ugcNames_ {}, + issuanceDateTime_ {} { } diff --git a/wxdata/source/scwx/awips/text_product_message.cpp b/wxdata/source/scwx/awips/text_product_message.cpp index 217a0d96..ce22f534 100644 --- a/wxdata/source/scwx/awips/text_product_message.cpp +++ b/wxdata/source/scwx/awips/text_product_message.cpp @@ -333,7 +333,9 @@ std::optional TryParseSegmentHeader(std::istream& is) { // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702) // Look for SSF(NNN)?[->] to key the UGC string + // Look for DDHHMM- to end the UGC string static const std::regex reUgcString {"^[A-Z]{2}[CZ]([0-9]{3})?[->]"}; + static const std::regex reUgcExpiration {"[0-9]{6}-$"}; std::optional header = std::nullopt; std::string line; @@ -344,7 +346,18 @@ std::optional TryParseSegmentHeader(std::istream& is) if (std::regex_search(line, reUgcString)) { header = SegmentHeader(); - header->ugcString_.swap(line); + header->ugcString_.push_back(line); + + // If UGC is multi-line, continue parsing + while (!is.eof() && is.peek() != '\r' && + !std::regex_search(line, reUgcExpiration)) + { + util::getline(is, line); + header->ugcString_.push_back(line); + } + + // Parse UGC + header->ugc_.Parse(header->ugcString_); } if (header.has_value())