PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/sources/gini.h

https://github.com/andreisavu/static-httpd
C Header | 284 lines | 184 code | 47 blank | 53 comment | 39 complexity | 8d36c1fa94859ac88d622d137ef59d5f MD5 | raw file
  1. /*
  2. (c) GarajCode
  3. Ini file preprocesor
  4. Date : 16 iulie 2005
  5. Last date : 25 februarie 2006
  6. */
  7. // Change log:
  8. // 17 august 2005 - marite bufferele pentru parsing
  9. // 23 februarie 2006 - verificare existenta fisier - comentarii doxygen
  10. #ifndef GARAJ_INI_PREPROCESOR
  11. #define GARAJ_INI_PREPROCESOR
  12. // dezactiveaza avertizarile STL
  13. #pragma warning(disable:4786)
  14. #pragma warning(disable:4786)
  15. #include "gdator.h"
  16. #include <fstream.h>
  17. #include <string>
  18. #include <map>
  19. #define MAX_LINE_LENGTH 2056 ///< Lungimea maxima a unei linii din fisierul ini
  20. #define MAX_VAR_NAME_LENGTH 128 ///< Lungimea maxima a unei variabile din ini
  21. #define MAX_DATA_LENGTH ( MAX_LINE_LENGTH - MAX_VAR_NAME_LENGTH - 5 ) ///< Lungimea maxima a valorii unei variabile
  22. /// Garaj Standard Namespace
  23. namespace GSTD
  24. {
  25. /// Informatia este retinuta in perechi de forma string si informatie
  26. typedef std::pair<std::string, CDator> INI_DATA;
  27. /// Procesor pentru fisiere ini
  28. /**
  29. Aceasta clasa implementeaza un procesor de fisiere ini.
  30. In fisier informatiile sunt de forma <nume>=<valoare>.
  31. Fiecare expresie de genul asta trebuie sa fie singura pe
  32. un rand. Sirurile de caractere care contin spate trebuie
  33. puse intre ghilimele.
  34. */
  35. class CIni
  36. {
  37. public:
  38. CIni()
  39. {
  40. }
  41. CIni( const CIni & ini )
  42. {
  43. m_data = ini.m_data;
  44. }
  45. CIni & operator = ( const CIni & ini )
  46. {
  47. m_data = ini.m_data;
  48. return *this;
  49. }
  50. ~CIni()
  51. {
  52. clear();
  53. }
  54. /// Incarca informatiile din fisierul de configurare
  55. int load( char * file )
  56. {
  57. // elibereaza datele actuale
  58. clear();
  59. // verifica daca fisierul exista
  60. FILE *f = fopen( file, "r" );
  61. if( !f ) return 0;
  62. fclose(f);
  63. // deschide fisier
  64. fstream fin(file, ios::in);
  65. // citeste linie
  66. char buffer[ MAX_LINE_LENGTH ];
  67. char var_name[ MAX_VAR_NAME_LENGTH ];
  68. char data[ MAX_DATA_LENGTH ];
  69. while( fin.getline( buffer, MAX_LINE_LENGTH ) )
  70. {
  71. // verifica daca avem comentariu
  72. if( is_comment(buffer) ) continue;
  73. // imparte linia in doua blocuri fata de =
  74. if( !split(buffer,var_name,data) ) continue;
  75. // adauga in lista noua variabila
  76. if( !m_data.count(var_name) )
  77. {
  78. INI_DATA new_data;
  79. new_data.first = var_name;
  80. new_data.second.convert(data);
  81. m_data.insert(new_data);
  82. }
  83. else
  84. {
  85. m_data[ var_name ].convert(data);
  86. }
  87. }
  88. return 1;
  89. }
  90. /// Elibereaza memoria alocata pentru date
  91. void clear()
  92. {
  93. m_data.clear();
  94. }
  95. /// Seteaza o anumita variabila cu un numar intreg
  96. void set( char* var_name, int value )
  97. {
  98. if( m_data.count( var_name ) )
  99. {
  100. m_data[ var_name ].set( value );
  101. }
  102. else
  103. {
  104. INI_DATA new_data;
  105. new_data.first = var_name;
  106. new_data.second.set( value );
  107. m_data.insert( new_data );
  108. }
  109. }
  110. /// Seteaza o variabila cu un numar real
  111. void set( char* var_name, float value )
  112. {
  113. if( m_data.count( var_name ) )
  114. {
  115. m_data[ var_name ].set( value );
  116. }
  117. else
  118. {
  119. INI_DATA new_data;
  120. new_data.first = var_name;
  121. new_data.second.set( value );
  122. m_data.insert( new_data );
  123. }
  124. }
  125. /// Seteaza o variabila cu un sir terminat cu zero
  126. void set( char* var_name, char *value )
  127. {
  128. if( m_data.count( var_name ) )
  129. {
  130. m_data[ var_name ].convert( value );
  131. }
  132. else
  133. {
  134. INI_DATA new_data;
  135. new_data.first = var_name;
  136. new_data.second.convert( value );
  137. m_data.insert( new_data );
  138. }
  139. }
  140. /// Verifica daca o variabila exista
  141. int is_set( char* var_name )
  142. {
  143. return m_data.count( var_name );
  144. }
  145. /// Returneaza o variabila
  146. CDator & get( char *var_name )
  147. {
  148. if( is_set(var_name) ) return m_data[ var_name ];
  149. return m_empty_dator;
  150. }
  151. /// Acceseaza variabilele
  152. CDator & operator [] ( char *var )
  153. {
  154. return get(var);
  155. }
  156. /// Iterator pentru datele retinute
  157. typedef std::map< std::string, CDator >::iterator iterator;
  158. /// Returneaza un iterator la inceputul dictionarului
  159. iterator begin() { return m_data.begin(); }
  160. /// Returneaza un iterator la sfarsitul dictionarului
  161. iterator end() { return m_data.end(); }
  162. protected:
  163. std::map< std::string, CDator > m_data; ///< Dictionarul in care sunt stocate informatiile
  164. CDator m_empty_dator; ///< O variabila goala
  165. /// Verifica daca sirul este un comentariu. Orice comentariu incepe cu #
  166. bool is_comment( char *buffer )
  167. {
  168. int l = strlen(buffer);
  169. int i=0;
  170. // skip initial white spaces
  171. while( buffer[i] == ' ' || buffer[i] == '\t') i++;
  172. // check for comment
  173. if( buffer[i] == '#' ) return true;
  174. return false;
  175. }
  176. /// Sare peste spatii albe
  177. void skip_white_space( int &i, char *buffer, int l )
  178. {
  179. while( (buffer[i] == ' ' || buffer[i] == '\t') && i<l ) i++;
  180. }
  181. /// Imparte sirul in doua subsiruri: nume variabila si informatie
  182. int split( char *buffer, char * var, char *data)
  183. {
  184. int k;
  185. int l = strlen(buffer);
  186. int i = 0;
  187. // sare peste spatiile initiale
  188. skip_white_space( i, buffer, l );
  189. // copiaza numele variabilei
  190. k = 0;
  191. while( buffer[i] != ' ' && buffer[i] != '\t' && buffer[i] != '=' && i < l)
  192. {
  193. var[ k ] = buffer[i];
  194. k++;
  195. i++;
  196. }
  197. var[k] = 0;
  198. // daca avem un sir vid atunci avem o problema
  199. if( !k ) return 0;
  200. if( buffer[i] == '=' ) i++;
  201. // sari peste spatii albe
  202. skip_white_space( i, buffer, l);
  203. // vezi daca am ajuns la egal
  204. if( buffer[i] == '=' ) i++;
  205. // evita spatii albe
  206. skip_white_space( i, buffer, l);
  207. // verifica daca avem un string
  208. if( buffer[i] == '\"' )
  209. {
  210. // copiaza tot pana la urmatoarea ghilimea
  211. i++;
  212. k = 0;
  213. while( buffer[i] != '\"' && i < l)
  214. {
  215. data[k] = buffer[i];
  216. k++;
  217. i++;
  218. }
  219. data[k] = 0;
  220. return 1;
  221. }
  222. // copiaza pana la primul spatiu liber sau comentariu
  223. k = 0;
  224. while( buffer[i] != ' ' && buffer[i] != '#' && buffer[i] != '\t' && i < l)
  225. {
  226. data[k] = buffer[i];
  227. k++;
  228. i++;
  229. }
  230. data[k] = 0;
  231. if( !k ) return 0;
  232. return 1;
  233. }
  234. };
  235. };
  236. #endif
  237. // (c) GarajCode 2005 - programmed by Savu Andrei