86 lines
3.4 KiB
C++
86 lines
3.4 KiB
C++
#ifndef FELIX_THE_CAT_FSYSTEM_CONFIGPARSER_HEADER_FILE_INCLUDED_KHKLJWGNBBVKJGLKXBVMZVEKLEKFJKJSAGSKAJGHJKBHQRPOTU
|
|
#define FELIX_THE_CAT_FSYSTEM_CONFIGPARSER_HEADER_FILE_INCLUDED_KHKLJWGNBBVKJGLKXBVMZVEKLEKFJKJSAGSKAJGHJKBHQRPOTU
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <set>
|
|
|
|
using namespace std;
|
|
|
|
const char CONFIGVALUETYPESTRING = 0;
|
|
const char CONFIGVALUETYPESET = 1;
|
|
|
|
class ConfigValue;
|
|
|
|
// Класс описывающий параметр из конфигурационного файла
|
|
class ConfigParam
|
|
{
|
|
public:
|
|
string name;
|
|
vector<ConfigValue> val;
|
|
// возвращает первое значение параметра (если их несколько)
|
|
string GetSingleVal() const;
|
|
// создаем из строки
|
|
ConfigParam(string name);
|
|
// создаем просто так
|
|
ConfigParam();
|
|
// создаем параметр с единственным значением
|
|
ConfigParam(string name, string value);
|
|
};
|
|
|
|
bool operator<(const ConfigParam &a, const ConfigParam &b);
|
|
|
|
|
|
// Класс, описывающий значение параметра в конфигурационном файле
|
|
class ConfigValue
|
|
{
|
|
public:
|
|
char type;
|
|
string sval;
|
|
set<ConfigParam> pval;
|
|
string GetParamVal(string pname) const;
|
|
};
|
|
|
|
// Класс, разбирающий конфигурационный файл
|
|
class ConfigParser
|
|
{
|
|
private:
|
|
char *s;
|
|
int slen;
|
|
int mode;
|
|
int cline;
|
|
// переделывает число в строку
|
|
string i2s(int a);
|
|
// разбирает s с l по r, считая, что она должна быть ConfigValue - ом
|
|
void ParseConfigValue(int &l, int &r, ConfigValue &vl);
|
|
// возвращает, является ли символ whitespace-ом
|
|
bool IsWS(char c);
|
|
// возвращает, может ли такой символ быть в имени параметра
|
|
bool GoodForName(char c);
|
|
// убирает двойные кавычки в начале/конце строки (если, конечно, таковые имеются)
|
|
void TrimQuotes(string &s);
|
|
// возвращает символ, соответствующий escape-последовательности "\c"
|
|
char UnSlash(char c);
|
|
// разбирает s с l по r, считая, что она должна быть ConfigParam - ом
|
|
// возвращает, какая операция была применена
|
|
int ParseConfigParam(int &l, int &r, ConfigParam &p);
|
|
// возращает, считается ли такой символ разделителем
|
|
// разделителями считаются ws-ы, скобки и запятые
|
|
bool IsDelim(char c);
|
|
// Разбирает несколько ConfigValues, заданных через запятую
|
|
void ParseConfigParamValues(int &l, int &r, ConfigParam &b);
|
|
void TrimSpaces(string &s);
|
|
public:
|
|
ConfigValue cfg;
|
|
// загружает конфигурационный файл
|
|
void Load(string fname);
|
|
// возвращает значение параметра (в старом стиле)
|
|
// генерирует исключение, если такого нет
|
|
string GetParam(string name);
|
|
// возвращает значение параметра (в старом стиле)
|
|
// возвращает пустую строку, если такого нет
|
|
string GetParamSilent(string name);
|
|
};
|
|
|
|
#endif
|