return parseValue ( str, ptr );
}
И ; Сам парсер определяется следующим классом.
К
class ConfigParser : public Object {
private:
Array items; // array of Configltem1s
public:
ConfigParser () : Object ( "Config Parser" ) {
metaClass = Sclasslnstance;
}
// parse data from source bool parse ( Data * data ) const; bool parse ( const char * fileName ) const;
void addltem ( Configltem * theltem ) {
items.insert ( theltem );
}
template <class T>
void addltem ( const char * itemName, T * ptr, T defValue )
{
items.insertNoRetain ( new BasicConfigltem <T> ( itemName, ptr, defValue ) );
}
protected:
void strip ( Strings str ) Const;
String buildFullName ( const Strings path,
const Strings name ) const;
static MetaClass classlnstance;
} ;
Перед началом разбора конфигурационного файла парсеру необходимо задать имена переменных и их значения по умолчанию при помощи шаблонного метода addltem. После этого вызывается метод parse для разбора файла, по окончании разбора зарегистрированным переменным будут присвоены значения (либо прочитанные из файла, либо значения по умолчанию). Ниже приводится пример разбора.
float f; int i; String s; ConfiParser parser;
parser. addltem ( "f", S:f, l.Of ),-
parser . addltem ( " somesection/i ", &i, 480 )
parser. addltem ( "sectionl/section2/str", S:s, String ( "abc" ) ) ,-
if ( [parser.parse ( "Arwen.cfg" ) )
(*sysLog) << "Error parsing Arwen.cfg" << logEndl;
Объектная модель. Основные классы
За счет использования объектов для разбора отдельных строк файла обеспечивается возможность добавления переменных новых типов.
На рис. 5.1 приводится иМЬ-диаграмма классов, используемых для разбора конфигурационных файлов.
Рис. 5.1
Основные классы, не относящиеся напрямую к рендерингу и обработке ввода, изображены на диаграмме, представленной на рис. 5.2.