map "Data/f.sc"
Как видно из приведенного примера, в конфигурационном файле допускаются комментарии (часть строки за символом '#' или ';' является комментарием и игнорируется, также игнорируются пустые строки). Внутри файла задаются параметры вида
name value
Первым идет имя параметра, далее идет значение. В случае строковых значений строка может заключаться в одинарные или двойные кавычки. Внутри файла также могут содержаться секции (с любым уровнем вложенности), в этом случае в качестве имени выступает полный путь к величине с учетом вложенности.
Для разбора конфигурационного файла также применяется объектный подход - парсер содержит список объектов, каждый из которых отвечает за разбор значения, соответствующего определенной переменной (объекты, унаследованные от класса Configltem). Когда при разборе файла парсер встречает очередное имя, то строится полное имя с учетом вложенности и ищется объект для разбора данного значения. Если соответствующий объект найден, то он получает запрос на разбор значения, соответствующего данной переменной. Если такого объекта нет, то вся строка просто игнорируется.
Класс Configltem определяется следующим образом:
class Configltem : public Object
// class to parse one config item
{
public:
Configltem ( const char * theName ) : Object ( theName ) {
metaClass = kclasslnstance;
}
virtual bool parseString ( const Strings str ) = 0; static MetaClass classlnstance;
Объектная модель. Основные классы
protected:
bool parseValue ( const Strings str, bool * ); bool parseValue ( const Strings str, int * ); bool parseValue ( const Strings str, float * ); bool parseValue ( const Strings str, String * );
};
Для удобства разбора стандартных типов можно использовать шаблоны, как показано ниже.
S
template <class Т>
class BasicConfigltem : public Configltem {
private:
T * ptr;
'public:
BasicConfigltem ( const char * theName, T * thePtr,
T defValue ) : Configltem ( theName )
{
ptr = thePtr; *ptr = defValue;
}
virtual bool parseString ( const Strings str ) {