Add Settings class for reading config files
This commit is contained in:
parent
b6189210d4
commit
c08b218f71
@ -231,6 +231,7 @@ set(mapper_SRCS
|
||||
TileGenerator.cpp
|
||||
ZlibDecompressor.cpp
|
||||
Color.cpp
|
||||
Settings.cpp
|
||||
BlockPos.cpp
|
||||
mapper.cpp
|
||||
)
|
||||
|
82
Settings.cpp
Normal file
82
Settings.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
|
||||
#include "Settings.h"
|
||||
|
||||
static std::string trim(const std::string s)
|
||||
{
|
||||
size_t start = s.find_first_not_of(" \t\r\n");
|
||||
size_t end = s.find_last_not_of(" \t\r\n");
|
||||
return s.substr(start, (end-start+1));
|
||||
}
|
||||
|
||||
Settings::Settings(std::string filename, std::string msgName)
|
||||
: m_filename(filename),
|
||||
m_messageName(msgName)
|
||||
{
|
||||
if (m_messageName == "")
|
||||
m_messageName = m_filename;
|
||||
m_file.open(m_filename.c_str(), std::ifstream::in);
|
||||
if (!m_file.is_open())
|
||||
throw std::runtime_error(std::string("Failed to open file '") + m_messageName + "'");
|
||||
}
|
||||
|
||||
Settings::~Settings(void)
|
||||
{
|
||||
m_file.close();
|
||||
}
|
||||
|
||||
std::string Settings::get(std::string key)
|
||||
{
|
||||
std::string value;
|
||||
if (getGeneric(key, &value))
|
||||
return value;
|
||||
else
|
||||
throw std::runtime_error(std::string("Failed to read key '") + key + "' from file '" + m_messageName + "'");
|
||||
}
|
||||
|
||||
std::string Settings::get(std::string key, std::string defaultValue)
|
||||
{
|
||||
std::string value;
|
||||
if (getGeneric(key, &value))
|
||||
return value;
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
bool Settings::getGeneric(std::string key, std::string *pvalue)
|
||||
{
|
||||
std::string line;
|
||||
int linenr = 0;
|
||||
bool found = false;
|
||||
m_file.clear();
|
||||
m_file.seekg(0);
|
||||
for (std::getline(m_file,line); m_file.good(); std::getline(m_file,line)) {
|
||||
linenr++;
|
||||
std::istringstream iline;
|
||||
iline.str(line);
|
||||
iline >> std::skipws;
|
||||
std::string variable;
|
||||
std::string eq;
|
||||
iline >> variable;
|
||||
if (variable != key)
|
||||
continue;
|
||||
found = true;
|
||||
iline >> eq;
|
||||
if (m_file.fail() || eq != "=") {
|
||||
std::ostringstream oss;
|
||||
oss << "Error parsing '" << key << "' in file " << m_messageName << " at line " << linenr << " (missing '=')";
|
||||
throw std::runtime_error(oss.str());
|
||||
}
|
||||
if (pvalue) {
|
||||
std::string value;
|
||||
iline >> value;
|
||||
if (m_file.fail()) {
|
||||
std::ostringstream oss;
|
||||
oss << "Error parsing value for '" << key << "' in file " << m_messageName << " at line " << linenr;
|
||||
throw std::runtime_error(oss.str());
|
||||
}
|
||||
*pvalue = trim(value);
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
25
Settings.h
Normal file
25
Settings.h
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
#ifndef _SETTINGS_H_
|
||||
#define _SETTINGS_H_
|
||||
|
||||
#include <stdexcept>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
|
||||
class Settings {
|
||||
public:
|
||||
Settings(std::string filename, std::string msgName = "");
|
||||
~Settings(void);
|
||||
std::string get(std::string key);
|
||||
std::string get(std::string key, std::string defaultValue);
|
||||
bool check(std::string key) { return getGeneric(key); }
|
||||
bool check(std::string key, std::string &value) { return getGeneric(key, &value); }
|
||||
private:
|
||||
std::string m_filename;
|
||||
std::string m_messageName;
|
||||
std::ifstream m_file;
|
||||
|
||||
bool getGeneric(std::string key, std::string *pvalue = NULL);
|
||||
};
|
||||
|
||||
#endif // _SETTINGS_H_
|
Loading…
x
Reference in New Issue
Block a user