7 #ifndef XGBOOST_COMMON_CONFIG_H_ 8 #define XGBOOST_COMMON_CONFIG_H_ 10 #include <xgboost/logging.h> 34 line_comment_regex_(
"^#"),
35 key_regex_(R
"rx(^([^#"'=\r\n\t ]+)[\t ]*=)rx"), 36 key_regex_escaped_(R"rx(^(["'])([^"'=\r\n]+)\1[\t ]*=)rx"), 37 value_regex_(R"rx(^([^#"'\r\n\t ]+)[\t ]*(?:#.*){0,1}$)rx"), 38 value_regex_escaped_(R"rx(^(["'])([^"'\r\n]+)\1[\t ]*(?:#.*){0,1}$)rx") 41 std::string LoadConfigFile(const std::string& path) {
42 std::ifstream fin(path, std::ios_base::in | std::ios_base::binary);
43 CHECK(fin) <<
"Failed to open: " << path;
44 std::string content{std::istreambuf_iterator<char>(fin),
45 std::istreambuf_iterator<char>()};
58 std::string NormalizeConfigEOL(std::string
const& config_str) {
60 std::stringstream ss(config_str);
61 for (
size_t i = 0; i < config_str.size(); ++i) {
62 if (config_str[i] ==
'\r') {
63 result.push_back(
'\n');
66 result.push_back(config_str[i]);
76 std::vector<std::pair<std::string, std::string>> Parse() {
77 std::string content { LoadConfigFile(path_) };
78 content = NormalizeConfigEOL(content);
79 std::stringstream ss { content };
80 std::vector<std::pair<std::string, std::string>> results;
82 std::string key, value;
84 while (std::getline(ss, line)) {
85 if (ParseKeyValuePair(line, &key, &value)) {
86 results.emplace_back(key, value);
94 const std::regex line_comment_regex_, key_regex_, key_regex_escaped_,
95 value_regex_, value_regex_escaped_;
103 static std::string TrimWhitespace(
const std::string& str) {
104 const auto first_char = str.find_first_not_of(
" \t\n\r");
105 const auto last_char = str.find_last_not_of(
" \t\n\r");
106 if (first_char == std::string::npos) {
108 return std::string();
110 CHECK_NE(last_char, std::string::npos);
111 const auto substr_len = last_char + 1 - first_char;
112 return str.substr(first_char, substr_len);
122 bool ParseKeyValuePair(
const std::string& str, std::string* key,
123 std::string* value) {
124 std::string buf = TrimWhitespace(str);
131 if (std::regex_search(buf, m, line_comment_regex_)) {
134 }
else if (std::regex_search(buf, m, key_regex_)) {
136 CHECK_EQ(m.size(), 2);
138 }
else if (std::regex_search(buf, m, key_regex_escaped_)) {
141 CHECK_EQ(m.size(), 3);
144 LOG(FATAL) <<
"This line is not a valid key-value pair: " << str;
148 buf = m.suffix().str();
149 buf = TrimWhitespace(buf);
150 if (std::regex_search(buf, m, value_regex_)) {
152 CHECK_EQ(m.size(), 2);
154 }
else if (std::regex_search(buf, m, value_regex_escaped_)) {
157 CHECK_EQ(m.size(), 3);
160 LOG(FATAL) <<
"This line is not a valid key-value pair: " << str;
168 #endif // XGBOOST_COMMON_CONFIG_H_ Implementation of config reader.
Definition: config.h:26
namespace of xgboost
Definition: base.h:102