18#include "absl/container/inlined_vector.h"
19#include "absl/status/status.h"
20#include "absl/status/statusor.h"
21#include "absl/strings/ascii.h"
22#include "absl/strings/match.h"
23#include "absl/strings/string_view.h"
30static constexpr int kFieldStartPos[
kNumMpsFields] = {1, 4, 14, 24, 39, 49};
33static constexpr int kFieldLength[
kNumMpsFields] = {2, 8, 8, 12, 8, 12};
36static constexpr int kSpacePos[12] = {12, 13, 22, 23, 36, 37,
37 38, 47, 48, 61, 62, 63};
44 absl::string_view line) {
46 line = absl::StripTrailingAsciiWhitespace(line);
47 if (!free_form && absl::StrContains(line,
'\t')) {
48 return absl::InvalidArgumentError(
"File contains tabs.");
51 MPSLineInfo line_info = MPSLineInfo(line_num, free_form, line);
52 if (!free_form && !line_info.IsFixedFormat()) {
61bool MPSLineInfo::IsFixedFormat()
const {
73 return first_word == line_ || first_word ==
"NAME";
75 constexpr int kMaxLineSize =
78 const int line_size = line_.size();
79 if (line_size > kMaxLineSize)
return false;
80 for (
const int i : kSpacePos) {
81 if (i >= line_size)
break;
82 if (line_[i] !=
' ')
return false;
87absl::Status MPSLineInfo::SplitLineIntoFields() {
89 absl::string_view remaining_line = absl::StripLeadingAsciiWhitespace(line_);
93 while (!remaining_line.empty()) {
99 const int pos = remaining_line.find_first_of(
" \t");
100 fields_.push_back(remaining_line.substr(0, pos));
101 if (pos == absl::string_view::npos) {
106 absl::StripLeadingAsciiWhitespace(remaining_line.substr(pos));
109 const int line_size = line_.size();
111 if (kFieldStartPos[i] >= line_size)
break;
112 fields_.push_back(absl::StripTrailingAsciiWhitespace(
113 line_.substr(kFieldStartPos[i], kFieldLength[i])));
116 return absl::OkStatus();
120 return line_.substr(0, line_.find(
' '));
126 return (line_.empty() || line_[0] ==
'*');
130 absl::string_view error_message)
const {
136 <<
" Line " << line_num_ <<
": \"" << line_ <<
"\".";
#define RETURN_IF_ERROR(expr)
absl::Status AppendLineToError(const absl::Status &status) const
bool IsCommentOrBlank() const
absl::Status InvalidArgumentError(absl::string_view error_message) const
bool IsNewSection() const
static absl::StatusOr< MPSLineInfo > Create(int64_t line_num, bool free_form, absl::string_view line)
absl::string_view GetFirstWord() const
StatusBuilder & SetAppend()
static constexpr int kNumMpsFields