hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Config.cpp
Go to the documentation of this file.
1 #include <stdio.h>
2 
3 #include <Config.h>
4 
5 
6 Config::Config(char *fName)
7 {
8  code.clear();
9  codeVal.clear();
10  FILE *f = fopen(fName, "r");
11  if (!f)
12  {
13  configExist = false;
14  }
15  else
16  {
17  configExist = true;
18  std::vector < char >sectionName;
19  std::vector < char >paramName;
20  std::vector < char >paramValue;
21  bool sectionFill = false;
22  bool paramFill = false;
23  bool valueFill = false;
24  bool checkSimple = false;
25  bool isSimple = false;
26  char leter;
27 
28  sectionName.clear();
29  paramName.clear();
30  paramValue.clear();
31  while (!feof(f))
32  {
33  int readCount = fread(&leter, sizeof(char), 1, f);
34  if (readCount)
35  {
36  if (leter == '[')
37  {
38  sectionFill = false;
39  sectionName.clear();
40  continue;
41  }
42  if (leter == ']')
43  {
44  sectionName.push_back(0);
45  sectionFill = true;
46  continue;
47  }
48  //filling the section name
49  if (!sectionFill && leter != ' ')
50  {
51  sectionName.push_back(leter);
52  continue;
53  }
54  //filling the paramName section
55  if (!paramFill)
56  {
57  if (leter != ' ' && leter != '\n')
58  {
59  if (leter != '=')
60  {
61  paramName.push_back(leter);
62  continue;
63  }
64  else
65  {
66  paramName.push_back(0);
67  paramFill = true;
68  checkSimple = true;
69  continue;
70  }
71  }
72  }
73  if (!valueFill && paramFill)
74  {
75  if (checkSimple)
76  {
77  checkSimple = false;
78  if (leter == '"')
79  {
80  isSimple = false;
81  continue;
82  }
83  else
84  {
85  isSimple = true;
86  }
87  }
88  if (!isSimple)
89  {
90  if (leter == '\n')
91  {
92  valueFill = true;
93  paramValue[paramValue.size() - 1] = 0;
94  paramValue.push_back(0);
95  createRecord(&sectionName, &paramName, &paramValue);
96  valueFill = false;
97  paramFill = false;
98  isSimple = true;
99  }
100  else
101  {
102  paramValue.push_back(leter);
103  }
104  }
105  else
106  {
107  if (leter != ' ')
108  {
109  if (leter == '\n')
110  {
111  valueFill = true;
112  paramValue.push_back(0);
113  createRecord(&sectionName, &paramName, &paramValue);
114  valueFill = false;
115  paramFill = false;
116  isSimple = true;
117  }
118  else
119  {
120  paramValue.push_back(leter);
121  }
122  }
123  }
124  }
125  }
126  }
127 
128  if (paramValue.size() > 0)
129  {
130  paramValue.push_back(0);
131  }
132  createRecord(&sectionName, &paramName, &paramValue);
133  fclose(f);
134  }
135 }
136 
137 
139 {
140  for (unsigned int i = 0; i < code.size(); i++)
141  {
142  delete[]code[i];
143  delete[]codeVal[i];
144  }
145 }
146 
148 {
149  for (unsigned int i = 0; i < code.size(); i++)
150  {
151  printf("pair %s - %s\n", code[i], codeVal[i]);
152  }
153 }
154 
155 
156 void Config::getAsString(const char *sectionName,const char *paramName, char *&value,
157  const char *defValue)
158 {
159  char *findValue = new char[strlen(sectionName) + strlen(paramName) + 1];
160  strcpy(findValue, sectionName);
161  strcat(findValue, paramName);
162  int index = getIndex(findValue);
163  if (index < 0)
164  {
165  //no find
166  value = new char[strlen(defValue) + 1];
167  strcpy(value, defValue);
168  }
169  else
170  {
171  value = new char[strlen(codeVal[index]) + 1];
172  strcpy(value, codeVal[index]);
173  }
174  delete[]findValue;
175 }
176 
177 
178 void Config::getAsInt(const char *sectionName, const char *paramName, int &value,
179  int defValue)
180 {
181  char *findValue = new char[strlen(sectionName) + strlen(paramName) + 1];
182  strcpy(findValue, sectionName);
183  strcat(findValue, paramName);
184  int index = getIndex(findValue);
185  if (index < 0)
186  {
187  //no find
188  value = defValue;
189  }
190  else
191  {
192  value = atoi(codeVal[index]);
193  }
194  delete[]findValue;
195 }
196 
197 
198 void Config::getAsUnsigned(const char *sectionName,const char *paramName,
199  unsigned int &value, unsigned int defValue)
200 {
201  char *findValue = new char[strlen(sectionName) + strlen(paramName) + 1];
202  strcpy(findValue, sectionName);
203  strcat(findValue, paramName);
204  int index = getIndex(findValue);
205  if (index < 0)
206  {
207  //no find
208  value = defValue;
209  }
210  else
211  {
212  value = (unsigned int) atoi(codeVal[index]);
213  }
214  delete[]findValue;
215 }
216 
217 void Config::getAsInt64 (const char *sectionName, const char *paramName, u_int64_t &value, u_int64_t defValue)
218 {
219  char *findValue = new char[strlen (sectionName) + strlen (paramName) + 1];
220  strcpy (findValue, sectionName);
221  strcat (findValue, paramName);
222  int index = getIndex (findValue);
223  if (index < 0)
224  {
225  //no find
226  value = defValue;
227  }
228  else
229  {
230  value = (u_int64_t)atoll (codeVal[index]);
231  }
232  delete[] findValue;
233 }
234 
235 void Config::getAsBool(const char *sectionName, const char *paramName, bool & value,
236  bool defValue)
237 {
238  char *findValue = new char[strlen(sectionName) + strlen(paramName) + 1];
239  strcpy(findValue, sectionName);
240  strcat(findValue, paramName);
241  int index = getIndex(findValue);
242  if (index < 0)
243  {
244  //no find
245  value = defValue;
246  }
247  else
248  {
249  value = atoi(codeVal[index]);
250  }
251  delete[]findValue;
252 }
253 
254 
255 void Config::getAsDouble(const char *sectionName, const char *paramName, double &value, double defValue)
256 {
257  char *findValue = new char[strlen(sectionName) + strlen(paramName) + 1];
258  strcpy(findValue, sectionName);
259  strcat(findValue, paramName);
260  int index = getIndex(findValue);
261  if (index < 0)
262  {
263  //no find
264  value = defValue;
265  }
266  else
267  {
268  value = atof(codeVal[index]);
269  }
270  delete[]findValue;
271 }
272 
273 void Config::readSection(const char *sectionName, char **&values1, int &size)
274 {
275  std::vector < char *>sectionParams;
276  sectionParams.clear();
277  int pos = 0;
278  size = 0;
279  for (unsigned int i = 0; i < code.size(); i++)
280  {
281  if (findSection(code[i], sectionName, pos))
282  {
283  size += 2;
284  char *paramName = new char[strlen(code[i])];
285  char *paramValue = new char[strlen(codeVal[i]) + 1];
286  strcpy(paramValue, codeVal[i]);
287  strcpy(paramName, code[i] + pos);
288  sectionParams.push_back(paramName);
289  sectionParams.push_back(paramValue);
290  }
291  }
292  if (size != 0)
293  {
294  values1 = new char *[size];
295  for (unsigned int i = 0; i < sectionParams.size(); i += 2)
296  {
297  values1[i] = new char[strlen(sectionParams[i]) + 1];
298  strcpy(values1[i], sectionParams[i]);
299  values1[i + 1] = new char[strlen(sectionParams[i + 1]) + 1];
300  strcpy(values1[i + 1], sectionParams[i + 1]);
301  delete[]sectionParams[i];
302  delete[]sectionParams[i + 1];
303  }
304  }
305 }
306 
307 
309 {
310  return configExist;
311 }
312 
313 void Config::createRecord(std::vector < char >*sectionName,
314  std::vector < char >*paramName,
315  std::vector < char >*paramValue)
316 {
317  if (sectionName->size() && paramName->size() && paramValue->size())
318  {
319  char *key = new char[sectionName->size() + paramName->size() + 1];
320  char *value = new char[paramValue->size() + 1];
321  strcpy(key, &(*sectionName)[0]);
322  strcat(key, &(*paramName)[0]);
323  strcpy(value, &(*paramValue)[0]);
324  code.push_back(key);
325  codeVal.push_back(value);
326  paramName->clear();
327  paramValue->clear();
328  }
329 }
330 
331 int Config::getIndex(char *value)
332 {
333  for (unsigned int i = 0; i < code.size(); i++)
334  {
335  if (strcmp(code[i], value) == 0)
336  {
337  return i;
338  }
339  }
340  return -1;
341 }
342 
343 bool Config::findSection(const char *codeValue, const char *sectionName, int &pos)
344 {
345  pos = 0;
346  while (*(sectionName + pos))
347  {
348  if (codeValue[pos] == 0 || sectionName[pos] != codeValue[pos])
349  {
350  return false;
351  }
352  pos++;
353  }
354  return true;
355 }