10using namespace Tempest;
13 if(a.size()!=b.size())
15 for(
size_t i=0; i<a.size(); ++i) {
18 if(
'a'<=ca && ca<=
'z')
19 ca = char((ca-
'a')+
'A');
20 if(
'a'<=cb && cb<=
'z')
21 cb = char((cb-
'a')+
'A');
29 fileName = std::u16string(file);
32 size_t li = fileName.find_last_of(
'/') + 1;
33 for(
size_t i=li; i<255 && i<file.size(); ++i)
34 name[i-li] =
char(file.data()[i]);
35 Log::e(
"no \"", name,
"\" file in path - using default settings");
44 Log::e(
"unable to read .ini file");
59 s <<
"[" << i.name <<
"]" << std::endl << std::endl;
61 s << r.name <<
"=" << r.val << std::endl << std::endl;
68 f.write(&str[0],str.size());
72 Log::e(
"unable to update .ini file");
84 return (
nullptr != find(s,name,
false));
88 if(
auto* val = find(s,name,
false))
93void IniFile::set(std::string_view sec, std::string_view name,
int ival) {
94 if(sec.empty() || name.empty())
96 auto& v = find(sec,name);
97 v.val = std::to_string(ival);
102 if(
auto* val = find(s,name,
false))
107void IniFile::set(std::string_view sec, std::string_view name,
float fval) {
108 if(sec.empty() || name.empty())
110 auto& v = find(sec,name);
111 v.val = std::to_string(fval);
116 if(
auto* val = find(s,name,
false))
121void IniFile::set(std::string_view sec, std::string_view name, std::string_view sval) {
122 if(sec.empty() || name.empty())
124 auto& v = find(sec,name);
129void IniFile::implRead(RFile &fin) {
130 size_t sz = fin.size();
131 std::string str(sz,
'\0');
132 fin.read(&str[0],sz);
134 std::stringstream s(str);
140void IniFile::implLine(std::istream &s) {
141 char ch=implSpace(s);
145 std::string name = implName(s);
146 addSection(std::move(name));
148 std::string name = implName(s);
150 while(ch!=
'=' && ch!=
'\n' && ch!=
'\r' && ch!=
'\0' && !s.eof())
152 std::string value = implValue(s);
153 addValue(std::move(name),std::move(value));
156 while(ch!=
'\n' && ch!=
'\r' && ch!=
'\0' && !s.eof())
160char IniFile::implSpace(std::istream &s) {
161 char ch=char(s.peek());
162 while(std::isspace(ch) && !s.eof()){
169std::string IniFile::implName(std::istream &s) {
171 char ch=char(s.peek());
172 while(ch==
' ' && !s.eof()) {
176 while(ch!=
']' && ch!=
'=' && ch!=
'\n' && ch!=
'\r' && ch!=
';' && ch!=
' ' && !s.eof()){
184std::string IniFile::implValue(std::istream &s) {
186 char ch=char(s.peek());
187 while((ch==
' ' || ch==
'\t') && !s.eof()) {
191 while(ch!=
'\n' && ch!=
'\r' && ch!=
';' && !s.eof()){
195 if(ch==
' ' || ch==
'\t') {
200 }
while((ch==
' ' || ch==
'\t') && !s.eof());
203 if(!name.empty() && name.back()==
' ') {
209void IniFile::addSection(std::string &&name) {
214 sec.back().name = std::move(name);
217void IniFile::addValue(std::string &&name, std::string &&val) {
220 addValue(sec.back(),std::move(name),std::move(val));
223void IniFile::addValue(Section &sec, std::string &&name, std::string &&val) {
226 sec.val.emplace_back();
228 auto& v = sec.val.back();
229 v.name = std::move(name);
230 v.val = std::move(val);
233IniFile::Value& IniFile::find(std::string_view sec, std::string_view name) {
234 return *find(sec,name,
true);
237IniFile::Value* IniFile::find(std::string_view s, std::string_view name,
bool autoCreate) {
244 addValue(i,std::string(name),
"");
245 return &i.val.back();
254 addValue(sec.back(),std::string(name),
"");
255 return &sec.back().val[0];
260 return std::stoi(v.val);
269 return float(std::stod(v.val));
void set(std::string_view sec, std::string_view name, int ival)
auto getS(std::string_view sec, std::string_view name) -> std::string_view
float getF(std::string_view sec, std::string_view name, float fdef=0)
int getI(std::string_view sec, std::string_view name, int idef=0)
bool has(std::string_view sec)
static bool compareNoCase(std::string_view a, std::string_view b)
static bool compareNoCase(std::string_view sa, std::string_view sb)
bool exists(const std::u16string &path)