################################################################################
  Kodowanie Windows-1250, koniec wiersza CR+LF, test: Za gl ja
  Config - Obsuga plikw konfiguracyjnych
  Copyleft (C) 2007 Adam Sawicki
  Licencja: GNU LGPL
  Kontakt: mailto:sawickiap@poczta.onet.pl , http://regedit.gamedev.pl/
################################################################################


Wstp
================================================================================

Modu do wczytywania, odczytywania, przechowywania, zapsywania i oglnie do
zarzdzania konfiguracj. Obsuguje hierarchiczne pliki konfiguracyjne o skadni
wzorowanej na C/C++, np.:

  Value1 = ValueData1
  Value2 = "Value Data \"2\""
  Value3 = -10.5 // Komentarz
  TextValue = "Multiline
  Text"
  
  List = { item1, item2, "item3" }
  
  /* komentarz... */
  
  SubConfig {
    SubConfigValue = SubConfigValueData
  }


Konfiguracja
================================================================================

*Konfiguracja* to, w oglnym znaczeniu, zoona struktura danych przechowujca
rnego rodzaju zorganizowane dane przeznaczone do konfigurowania programu,
czyli zawierajce jakie ustawienia. Jest zwykle wczytywana przez program z
pliku podczas uruchamiania. Pliki konfiguracyjne mog by:

- Tylko odczytywane
  S przez program tylko czytane, a edytowane przez uytkownika.
- Odczytywane i zapisywane
  S przez program zarwno zapisywane jak i odczytywane. Zwykle nie wymagaj
  wtedy rcznych zmian ze strony uytkownika. Rcznie wyedytowane, ulegaj
  rozformatowaniu, a konkretnie podczas zapisywania konfiguracji:
  > Kolejno elementw nie zostaje zachowana - s sortowane alfabetycznie
  > Komentarze nie zostaj zachowane
  > Wcicia, puste wiersze i wszelkie formatowania nie zostaj zachowane


Skadnia
================================================================================

Format pliku konfiguracji oparty jest na module Tokenizer. Oznacza to, e
wystpuj w nim takie rodzaje tokenw, jak w C/C++, w szczeglnoci:

- Komentarze // ... i /* ... */
- Identyfikatory, np.: abc123
- acuchy, np.: "abc 123"
- Znaki, np.: 'A'
- Liczby cakowite, np.: -123
- Liczby zmiennoprzecinkowe, np.: 10.5
- Symbole, np.: = { } :

Koce wiersza nie maj znaczenia. Wielko liter ma znaczenie. Kolejno
elementw nie ma znaczenia.

Konfiguracja to hierarchia *elementw*. S 3 rodzaje elementw:

1. *Warto*
Posiada *dane*, czyli acuch znakw. Przeznaczona jest do przechowywania
krtkiej, pojedynczej danej tekstowej, np. liczby. Zapisana moe by jako
identyfikator, znak, acuch lub liczba. Przykady:

  Klucz1 = false
  Klucz2 = "Ala ma kota"
  Klucz3 = -123
  Klucz4 = '\0'
  Klucz5 = 2.0e-3

2. *Lista*
Sekwencja wartoci. Trzeba je oddziela przecinkami. Przykad:

  Klucz = { Dana1, "Dana2", 123 }

3. *Konfiguracja*
Mapa odwzorowujca *klucze* (te acuchy) na podelementy. Klucz musi by
identyfikatorem. Gwna konfiguracja, podobnie jak jej podkonfiguracje te jest
tego typu. Przykad:

  Klucz {
    PodKlucz1 = PodWartosc1
    podKlucz2 = "PodWarto 2"
    ...
  }


Kod
================================================================================

Te 3 rodzaje elementw odwzorowane s bezporednio na klasy dostpne w module
Config w przestrzeni nazw config. Swoje pola maj upublicznione, dlatego
umoliwiaj bezporedni manipulacj na swoich danych, jeli zachodzi taka
potrzeba. Kiedy chcemy uywa listy lub pobiera nazwy wszystkich podelementw
konfiguracji, musimy to robi rcznie. W przeciwnym wypadku moemy uywa
wygodnych metod klasy Config, ktre umoliwiaj typowe operacje zapisywania i
odczytywania danych z elementu o podanej *ciece*. cieka to acuch
zawierajcy np.:

	"Konfiguracja/PodKonfiguracja/PodPodKonfiguracja/Element"

Przykad typowego uycia moduu:

  common::Config cfg;
  cfg.LoadFromFile("Settings.cfg");

  int Timeout;
  cfg.MustGetDataEx("GeneralSettings/Timeout", &Timeout);

Istnieje zmienna globalna g_Config do dyspozycji uytkownika, ktra zapewnia
miejsce do przechowywania gwnej konfiguracji programu, aby kady mia do niej
dostp.

