| 1 |
/////////////////////////////////////////////////////////// |
|---|
| 2 |
// TexGen // |
|---|
| 3 |
// утилита для подготовки текстур рельефа // |
|---|
| 4 |
// для игры Проклятые Земли // |
|---|
| 5 |
// Copyright (C) 2007-2008 Gipat Group // |
|---|
| 6 |
// Распространяется на условиях // |
|---|
| 7 |
// Gipat Group's opened EI-editor-utility license // |
|---|
| 8 |
// версии 1.0 // |
|---|
| 9 |
// // |
|---|
| 10 |
// www.gipatgroup.org // |
|---|
| 11 |
/////////////////////////////////////////////////////////// |
|---|
| 12 |
|
|---|
| 13 |
//К работе над данным файлом приложили руки, ноги.... короче аффтары: |
|---|
| 14 |
// 1) Снайпер (sniper-rifle@rambler.ru) |
|---|
| 15 |
|
|---|
| 16 |
//////////////////////////////////////////////////////////////////////// |
|---|
| 17 |
|
|---|
| 18 |
#ifndef CConfigFileH |
|---|
| 19 |
#define CConfigFileH |
|---|
| 20 |
|
|---|
| 21 |
#include <dstring.h> |
|---|
| 22 |
#include <stddef.h> |
|---|
| 23 |
#include <StrUtils.hpp> |
|---|
| 24 |
#include <SysUtils.hpp> |
|---|
| 25 |
#include <stdio.h> |
|---|
| 26 |
|
|---|
| 27 |
//Некоторые константы: |
|---|
| 28 |
const AnsiString IniVersion = "1"; //Константа для проверки версии файла |
|---|
| 29 |
const AnsiString IniDefault = "Default"; //Просто константа %) А что, нельзя? ;) |
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 |
class CConfigFile |
|---|
| 33 |
{ |
|---|
| 34 |
private: |
|---|
| 35 |
struct ValueChain // Цепь пар "параметр - значения" |
|---|
| 36 |
{ |
|---|
| 37 |
AnsiString Name,Value; |
|---|
| 38 |
ValueChain *Next; |
|---|
| 39 |
}; |
|---|
| 40 |
struct SectionsChain //Цепь секций |
|---|
| 41 |
{ |
|---|
| 42 |
AnsiString Name; |
|---|
| 43 |
ValueChain *Start; |
|---|
| 44 |
SectionsChain *Next; |
|---|
| 45 |
}; |
|---|
| 46 |
|
|---|
| 47 |
//Здесь лежат контейнеры данных, над которыми работают открытые методы. |
|---|
| 48 |
AnsiString IniComment; //Комментарии, которые будут лежать в ini до начала полезных данных |
|---|
| 49 |
|
|---|
| 50 |
void RemoveValues(ValueChain *Start); //Нужно удалить все значения, которые были у раздела, при его удалении. |
|---|
| 51 |
void RemoveAllSect(); //Нужно очистить объект от данных |
|---|
| 52 |
SectionsChain *DataStart; |
|---|
| 53 |
|
|---|
| 54 |
public: |
|---|
| 55 |
CConfigFile(){DataStart=NULL;IniComment="";} |
|---|
| 56 |
~CConfigFile(){RemoveAllSect();} |
|---|
| 57 |
|
|---|
| 58 |
//По всему файлу |
|---|
| 59 |
void LoadConfig(AnsiString FileName); //Загружаем всю инфу из файла |
|---|
| 60 |
void SaveConfig(AnsiString FileName); //Савим данные в файл |
|---|
| 61 |
//По секциям |
|---|
| 62 |
bool SectionExists(AnsiString Name); //Проверяем существование секции (раздела) |
|---|
| 63 |
void AddSection(AnsiString Name); //Добавляем запись о новой секции в список |
|---|
| 64 |
void DelSection(AnsiString Name); //Удаляем секцию, а так же всю её информацию... |
|---|
| 65 |
void RenameSection(AnsiString Name, AnsiString NewName); //Меняем имя раздела. Всё просто. |
|---|
| 66 |
//По значениям |
|---|
| 67 |
bool ValueExists(AnsiString Section, AnsiString ValueName); //Проверяем, существует ли значение с заданным именем |
|---|
| 68 |
void AddValue(AnsiString Section, AnsiString ValueName, AnsiString Value = "");//Добавляет параметр в секцию. Весьма удобно... |
|---|
| 69 |
void DelValue(AnsiString Section, AnsiString ValueName); //Удаляет из секции первое вхождение параметра, хотя предполагается что их не будет >1 |
|---|
| 70 |
void RenameValue(AnsiString Section, AnsiString OldName, AnsiString NewName);//Переименовывает параметр |
|---|
| 71 |
void SetValue(AnsiString Section, AnsiString ValueName, AnsiString NewVal);//Задаёт значение параметра |
|---|
| 72 |
AnsiString GetValue(AnsiString Section, AnsiString ValueName); //Возвращает значение параметра. При ошибке возвращает пустую строку. |
|---|
| 73 |
AnsiString GetValueEx(AnsiString Section, AnsiString ValueName, AnsiString Default); // Упрощенная процедура if...then |
|---|
| 74 |
AnsiString GetComment(){return IniComment;} //Возвращает комментарии к файлу настроек |
|---|
| 75 |
void SetComment(AnsiString NewComm){IniComment = NewComm;} //Задаёт новый комментарий к файле настроек. |
|---|
| 76 |
|
|---|
| 77 |
void UpgradeProgaIni(); |
|---|
| 78 |
|
|---|
| 79 |
void Debug(); |
|---|
| 80 |
}; |
|---|
| 81 |
|
|---|
| 82 |
class CStringChain |
|---|
| 83 |
//Просто цепь стрингов. Эдакий двунаправленный список облегчённого вида %) |
|---|
| 84 |
{ |
|---|
| 85 |
private: |
|---|
| 86 |
public: |
|---|
| 87 |
CStringChain(){Pred = Next = NULL; Item = "";}; |
|---|
| 88 |
CStringChain(AnsiString I){Pred = Next = NULL; Item = I;}; |
|---|
| 89 |
|
|---|
| 90 |
AnsiString Item; |
|---|
| 91 |
CStringChain *Pred; |
|---|
| 92 |
CStringChain *Next; |
|---|
| 93 |
|
|---|
| 94 |
void AddNext(AnsiString *NewItem) |
|---|
| 95 |
{ |
|---|
| 96 |
CStringChain *X = new CStringChain; |
|---|
| 97 |
X->Item = *NewItem; |
|---|
| 98 |
X->Pred = this; |
|---|
| 99 |
X->Next = Next; |
|---|
| 100 |
Next = X; |
|---|
| 101 |
} |
|---|
| 102 |
|
|---|
| 103 |
void AddPred(AnsiString *NewItem) |
|---|
| 104 |
{ |
|---|
| 105 |
CStringChain *X = new CStringChain; |
|---|
| 106 |
X->Item = *NewItem; |
|---|
| 107 |
X->Next = this; |
|---|
| 108 |
X->Pred = Pred; |
|---|
| 109 |
Pred = X; |
|---|
| 110 |
} |
|---|
| 111 |
|
|---|
| 112 |
void DelNext() |
|---|
| 113 |
{ |
|---|
| 114 |
CStringChain *X = Next; |
|---|
| 115 |
Next = X->Next; |
|---|
| 116 |
X->Next = NULL; |
|---|
| 117 |
delete X; |
|---|
| 118 |
} |
|---|
| 119 |
|
|---|
| 120 |
void DelPred() |
|---|
| 121 |
{ |
|---|
| 122 |
CStringChain *X = Pred; |
|---|
| 123 |
Pred = X->Pred; |
|---|
| 124 |
X->Pred = NULL; |
|---|
| 125 |
delete X; |
|---|
| 126 |
} |
|---|
| 127 |
|
|---|
| 128 |
void CopyFrom(CStringChain *Source) |
|---|
| 129 |
{ |
|---|
| 130 |
//Метод помещает копию элементов Сурц перед текущим элементом. |
|---|
| 131 |
Pred = NULL; |
|---|
| 132 |
if(Next != NULL)delete Next; |
|---|
| 133 |
|
|---|
| 134 |
while(Source != NULL) |
|---|
| 135 |
{ |
|---|
| 136 |
AddPred(&Source->Item); |
|---|
| 137 |
Source = Source->Next; |
|---|
| 138 |
} |
|---|
| 139 |
} |
|---|
| 140 |
|
|---|
| 141 |
void Merge(CStringChain *Brunch) |
|---|
| 142 |
{ |
|---|
| 143 |
//Метод приклеивает Brunch после последнего элемента |
|---|
| 144 |
if(Next!=NULL) |
|---|
| 145 |
{ |
|---|
| 146 |
Next->Merge(Brunch); |
|---|
| 147 |
} |
|---|
| 148 |
else |
|---|
| 149 |
{ |
|---|
| 150 |
Next = Brunch; |
|---|
| 151 |
Brunch->Pred = this; |
|---|
| 152 |
} |
|---|
| 153 |
} |
|---|
| 154 |
|
|---|
| 155 |
AnsiString ToStr() |
|---|
| 156 |
{ |
|---|
| 157 |
//Рекурсивно собираем инфу %) Хотя могли бы и в цикле конечно... |
|---|
| 158 |
AnsiString Rez=""; |
|---|
| 159 |
if(this!=NULL) |
|---|
| 160 |
{ |
|---|
| 161 |
Rez = Item; |
|---|
| 162 |
} |
|---|
| 163 |
if(Next!=NULL) |
|---|
| 164 |
{ |
|---|
| 165 |
Rez += "\r\n"+Next->ToStr(); |
|---|
| 166 |
} |
|---|
| 167 |
return Rez; |
|---|
| 168 |
} |
|---|
| 169 |
|
|---|
| 170 |
void FromStr(AnsiString *Source) |
|---|
| 171 |
{ |
|---|
| 172 |
if(Source!=NULL) |
|---|
| 173 |
{ |
|---|
| 174 |
int i=AnsiPos("\r\n",*Source); |
|---|
| 175 |
if(i>0) |
|---|
| 176 |
{ |
|---|
| 177 |
Item = LeftStr(*Source, i-1); |
|---|
| 178 |
*Source = RightStr(*Source, Source->Length() - i - 1); |
|---|
| 179 |
if(Next != NULL) |
|---|
| 180 |
{ |
|---|
| 181 |
Next->FromStr(Source); |
|---|
| 182 |
} |
|---|
| 183 |
} |
|---|
| 184 |
else |
|---|
| 185 |
{ |
|---|
| 186 |
Item = *Source; |
|---|
| 187 |
*Source=""; |
|---|
| 188 |
} |
|---|
| 189 |
} |
|---|
| 190 |
} |
|---|
| 191 |
|
|---|
| 192 |
~CStringChain(){if(Next != NULL)delete Next;} |
|---|
| 193 |
}; |
|---|
| 194 |
#endif |
|---|