39#include "lcf/inireader.h"
43INIReader::INIReader(std::string filename)
45 _error = ini_parse(filename.c_str(), ValueHandler,
this);
48INIReader::INIReader(std::istream& filestream)
50 _error = ini_parse_stream([](
char* str,
int num,
void* stream) {
51 std::istream* is =
reinterpret_cast<std::istream*
>(stream);
56 std::istream::sentry se(*is,
true);
57 std::streambuf* sb = is->rdbuf();
68 if (sb->sgetc() ==
'\n') {
76 is->setstate(std::ios::eofbit);
85 if (out.empty() && (is->fail() || is->eof())) {
86 return (
char*)
nullptr;
89 strncpy(str, out.c_str(), num);
95 return (
char*)
nullptr;
96 }, &filestream, ValueHandler,
this);
99int INIReader::ParseError()
const
104std::string_view INIReader::Get(std::string_view section, std::string_view name, std::string_view default_value)
const
106 std::string key = MakeKey(section, name);
108 auto it = _values.find(key);
109 if (it == _values.end()) {
110 return default_value;
115std::string_view INIReader::GetString(std::string_view section, std::string_view name, std::string_view default_value)
const
117 auto str = Get(section, name,
"");
118 return str.empty() ? default_value : str;
121long INIReader::GetInteger(std::string_view section, std::string_view name,
long default_value)
const
123 std::string_view valstr = Get(section, name,
"");
125 auto ec = std::from_chars(valstr.data(), valstr.data() + valstr.size(), n).ec;
126 return ec == std::errc() ? n : default_value;
129double INIReader::GetReal(std::string_view section, std::string_view name,
double default_value)
const
131 std::string valstr = std::string(Get(section, name,
""));
132 const char* value = valstr.c_str();
134 double n = strtod(value, &end);
135 return end > value ? n : default_value;
145bool INIReader::GetBoolean(std::string_view section, std::string_view name,
bool default_value)
const
147 auto valstr = std::string(Get(section, name,
""));
149 std::transform(valstr.begin(), valstr.end(), valstr.begin(), ::tolower);
150 if (valstr ==
"true" || valstr ==
"yes" || valstr ==
"on" || valstr ==
"1")
152 else if (valstr ==
"false" || valstr ==
"no" || valstr ==
"off" || valstr ==
"0")
155 return default_value;
158bool INIReader::HasValue(std::string_view section, std::string_view name)
const
160 std::string key = MakeKey(section, name);
161 return _values.find(key) != _values.end();
164std::string INIReader::MakeKey(std::string_view section, std::string_view name)
166 std::string key = std::string(section) +
"=" + std::string(name);
168 std::transform(key.begin(), key.end(), key.begin(), ::tolower);
172int INIReader::ValueHandler(
void* user,
const char* section,
const char* name,
175 INIReader* reader =
static_cast<INIReader*
>(user);
176 std::string key = MakeKey(section, name);
178 auto [it, inserted] = reader->_values.try_emplace(key, value);