Парсер ini-файлів у бібліотеці LEM пошукового движка

Досить часто виникає потреба працювати з так званими ini-файлами. У Windows такі файли використовуються досить рідко, а в Linux - дуже часто. У цих файлах розробники програм збирають різні настановні параметри, які з одного боку змінюються досить рідко, а з іншого боку забивати з коду програми нерозумно.

Зазвичай зустрічається такий формат:

Тобто параметри збираються до іменованих секцій.

Для роботи з такими файлами створено два класи Ini_Parser та Xml_Parser. у просторі імен lem::Cfg_Parser.

Вони оголошені у cfg_parser.h.

Для відкриття файлу викликається метод Open, якому передається покажчик потік - об'єкт-нащадок класу BaseStream. У конструкторі відбувається повний парсинг файлу, будується дерево параметрів. Для розбивки текстового файлу на лексеми використається лексер Base_Parser.

Дерево секцій і параметрів згадано у зв'язку з тим, що формат файлу, що розбирається, може бути досить складний, зокрема секції можуть бути вкладеними. Наприклад:

Таким чином, вкладені секції вводяться за допомогою парних фігурних дужок.

Дерево секцій та параметрів складається з об'єктів SectionTree. Отримати доступ до дерева можна у похідних від Base_ProFile класах. Отримавши посилання на побудоване дерево за допомогою методу Base_ProFile::GetTree(), можна вільно переміщатися деревом за допомогою методів Prev(), Next() , Up() , Down() класу SectionTree.

Після завантаження дерева програма може:

1 . Переміщуватись по дереву секцій та параметрів, встановлюючи поточну секцію. І тому використовується метод ::seek_section(), якому передаєтьсяшлях до секції. Якщо метод повернув false, тосталася помилка позиціонування на секції (зазвичай це означає, що такої секції немає).

Якщо вкладених секцій немає, шлях до секції збігається з її ім'ям.

Якщо є вкладені секції, то шлях до секції включає імена батьківських секцій, розділені символом зворотного слеша \. Шлях може бути відносним - у разі переміщення починається від поточної секції. Відносний шлях має вигляд

Тобто, точка позначає поточну секцію. Дві точки означають кореневу для поточної секції:

Двокрапка - корінь всього дерева:

Загалом шляхи до секцій дуже схожі на файлові шляхи.

2 . Зчитувати параметри з поточної секції або довільних.

Для цього використовуються методи get_int, get_bool, get_string, get_real. Вони отримують шлях до секції (порожній рядок означає поточну секцію), ім'я параметра та значення за промовчанням, яке повертається, якщо параметр не знайдено.

Після переміщення на секцію методом seek_section() можна перебрати всі параметри в цій секції (пропускаючи вкладені) за допомогою методу GetNextVar().

3. Зміна параметрів. Нове значення відразу записується у вихідний файл ini. Використовується метод write_to_config(), якому вказується ім'я секції, ім'я параметра та значення параметра (рядки). Якщо зазначеної секції немає, вона буде створена. Аналогічно для параметра: якщо такого параметра в секції немає, він буде вписаний, інакше - буде змінено його значення.