KSquare Utilities
Configuration.cpp
Go to the documentation of this file.
1 /* Configuration.cpp -- Generic Configuration file manager.
2  * Copyright (C) 1994-2011 Kurt Kramer
3  * For conditions of distribution and use, see copyright notice in KKB.h
4  */
5 #include "FirstIncludes.h"
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string>
9 #include <iostream>
10 #include <fstream>
11 #include <vector>
12 #include "MemoryDebug.h"
13 using namespace std;
14 
15 
16 #ifdef WIN32
17 #include <windows.h>
18 #endif
19 
20 
21 #include "Configuration.h"
22 #include "KKQueue.h"
23 #include "OSservices.h"
24 #include "RunLog.h"
25 using namespace KKB;
26 
27 
28 
29 namespace KKB
30 {
32  {
33  public:
34  Setting (const KKStr& _name,
35  const KKStr& _value,
36  kkint32 _lineNum
37  ):
38  lineNum (_lineNum),
39  name (_name),
40  value (_value)
41  {}
42 
44  lineNum (s.lineNum),
45  name (s.name),
46  value (s.value)
47  {}
48 
49  kkint32 LineNum () const {return lineNum;}
50  KKStrConstPtr Name () const {return &name;}
51  KKStrConstPtr Value () const {return &value;}
52 
54 
55  private:
56  kkint32 lineNum;
57  KKStr name;
58  KKStr value;
59  }; /* Setting */
60 
61 
62 
64  {
65  public:
66  SettingList (): KKQueue<Setting> (true) {}
67 
68  SettingList (const SettingList& sl):
69  KKQueue<Setting> (true)
70  {
71  kkuint32 x;
72  for (x = 0; x < sl.size (); x++)
73  {
74  SettingPtr setting = sl.IdxToPtr (x);
75  PushOnBack (new Configuration::Setting (*setting));
76  }
77  }
78 
80  {
81  kkint32 memoryConsumedEstimated = sizeof (SettingList);
82  SettingList::const_iterator idx;
83  for (idx = begin (); idx != end (); ++idx)
84  memoryConsumedEstimated += (*idx)->MemoryConsumedEstimated ();
85  return memoryConsumedEstimated;
86  }
87 
88 
89  SettingPtr LookUp (const KKStr& name)
90  {
91  kkint32 idx;
92  kkint32 qSize = QueueSize ();
93  for (idx = 0; idx < qSize; idx++)
94  {
95  SettingPtr setting = IdxToPtr (idx);
96  if (name.EqualIgnoreCase (setting->Name ()))
97  return setting;
98  }
99  return NULL;
100  } /* LookUp */
101 
102 
103 
104  kkint32 LookUpLineNum (const KKStr& name) const
105  {
106  const_iterator idx;
107  for (idx = begin (); idx != end (); idx++)
108  {
109  SettingPtr s = *idx;
110  if (s->Name ()->EqualIgnoreCase (name))
111  return s->LineNum ();
112  }
113  return -1;
114  } /* LookUpLineNum */
115 
116 
117  void AddSetting (SettingPtr setting)
118  {
119  PushOnBack (setting);
120  }
121 
122 
123  void AddSetting (const KKStr& _name,
124  const KKStr& _value,
125  kkint32 _lineNum
126  )
127  {
128  PushOnBack (new Setting (_name, _value, _lineNum));
129  }
130  }; /* SettingList */
131 
132 
133 
134 
136  {
137  public:
138  ConfSection (const KKStr& _name,
139  kkint32 _lineNum
140  ):
141  lineNum (_lineNum),
142  name (_name),
143  settings ()
144  {}
145 
147  lineNum (cs.lineNum),
148  name (cs.name),
150  {}
151 
152 
153  kkint32 LineNum () const {return lineNum;}
154 
155  KKStrConstPtr Name () {return &name;}
156 
158  {
159  return sizeof (lineNum) + name.MemoryConsumedEstimated () + settings.MemoryConsumedEstimated ();
160  }
161 
162 
163  kkint32 NumOfSettings () const {return settings.QueueSize ();}
164 
165 
166  KKStrConstPtr SettingName (kkint32 settingNum) const
167  {
168  if (settingNum >= (kkint32)settings.size ())
169  return NULL;
170  return settings[settingNum].Name ();
171  }
172 
173  KKStrConstPtr SettingValue (kkint32 settingNum, kkint32& lineNum) const
174  {
175  if (settingNum >= (kkint32)settings.size ())
176  return NULL;
177  lineNum = settings[settingNum].LineNum ();
178  return settings[settingNum].Value ();
179  }
180 
181  void GetSettings (kkint32 settingNum,
182  KKStrConstPtr& name,
183  KKStrConstPtr& value,
184  kkint32& lineNum
185  )
186  {
187  SettingPtr setting = settings.IdxToPtr (settingNum);
188  if (setting)
189  {
190  name = setting->Name ();
191  value = setting->Value ();
192  lineNum = setting->LineNum ();
193  }
194  else
195  {
196  name = NULL;
197  value = NULL;
198  lineNum = -1;
199  }
200  }
201 
202 
203  void AddSetting (const KKStr& _name,
204  const KKStr& _value,
205  kkint32 _lineNum
206  )
207  {
208  settings.AddSetting (_name, _value, _lineNum);
209  }
210 
211  KKStrConstPtr LookUpValue (const KKStr& _name, kkint32& lineNum)
212  {
213  SettingPtr setting = settings.LookUp (_name);
214  if (setting)
215  {
216  lineNum = setting->LineNum ();
217  return setting->Value ();
218  }
219  else
220  {
221  lineNum = -1;
222  return NULL;
223  }
224  }
225 
226  private:
227  kkint32 lineNum; // Text Line Number where section starts.
228  KKStr name;
229  SettingList settings;
230  }; /* ConfSection */
231 
232 
233 
235  {
236  public:
238 
239 
241  {
242  kkint32 memoryConsumedEstimated = sizeof (ConfSectionList);
243  ConfSectionList::const_iterator idx;
244  for (idx = begin (); idx != end (); ++idx)
245  memoryConsumedEstimated += (*idx)->MemoryConsumedEstimated ();
246  return memoryConsumedEstimated;
247  }
248 
249 
250  ConfSectionPtr LookUp (const KKStr& _name)
251  {
252  ConfSectionPtr tempSection = NULL;
253  ConfSectionPtr section = NULL;
254  ConfSectionList::const_iterator idx;
255  for (idx = begin (); idx != end (); ++idx)
256  {
257  tempSection = *idx;
258  if (_name.EqualIgnoreCase (tempSection->Name ()))
259  {
260  section = tempSection;
261  break;
262  }
263  }
264 
265  return section;
266  } /* LookUp */
267 
268 
269  void AddConfSection (ConfSectionPtr section)
270  {
271  PushOnBack (section);
272  }
273 
274 
275  void AddConfSection (const KKStr& _name,
276  kkint32 _lineNum
277  )
278  {
279  PushOnBack (new ConfSection (_name, _lineNum));
280  }
281  }; /* ConfSectionList */
282 } /* KKB */
283 
284 
285 
286 Configuration::Configuration (const KKStr& _fileName,
287  RunLog& _log
288  ):
289  curSectionName (),
290  fileName (_fileName),
291  formatGood (true),
292  formatErrors (),
293  formatErrorsLineNums (),
294  sections (NULL)
295 {
296  sections = new ConfSectionList ();
297  LoadFile (_log);
298 }
299 
300 
302  curSectionName (),
303  fileName (),
304  formatGood (true),
305  formatErrors (),
306  formatErrorsLineNums (),
307  sections (NULL)
308 {
309  sections = new ConfSectionList ();
310 }
311 
312 
313 
315 
316  curSectionName (c.curSectionName),
317  fileName (c.fileName),
318  formatGood (c.formatGood),
319  formatErrors (c.formatErrors),
320  formatErrorsLineNums (c.formatErrorsLineNums),
321  sections (NULL)
322 {
323  sections = new ConfSectionList ();
324 
325  kkint32 x;
326 
327  for (x = 0; x < sections->QueueSize (); x++)
328  {
329  const ConfSectionPtr cs = sections->IdxToPtr (x);
330  sections->AddConfSection (new ConfSection (*cs));
331  }
332 }
333 
334 
335 
337 {
338  delete sections;
339 }
340 
341 
342 
344 {
345  kkint32 memoryConsumedEstimated = sizeof (Configuration)
346  + curSectionName.MemoryConsumedEstimated ()
347  + fileName.MemoryConsumedEstimated ()
348  + (kkint32)formatErrors.size () * 100
349  + (kkint32)formatErrorsLineNums.size () * sizeof (kkint32);
350 
351  if (sections)
352  memoryConsumedEstimated += sections->MemoryConsumedEstimated ();
353 
354  return memoryConsumedEstimated;
355 } /* MemoryConsumedEstimated */
356 
357 
358 
360 {
361  bool found = false;
362  kkint32 len = line.Len ();
363  kkint32 x = 0;
364 
365 
366  while ((x < (len - 1)) && (!found))
367  {
368  if ((line[x] == '/') &&
369  (line[x + 1] == '/'))
370  found = true;
371  else
372  x++;
373  }
374 
375  if (found)
376  {
377  if (x == 0)
378  line = "";
379  else
380  line = line.SubStrPart (0, x - 1);
381  }
382 
383 } /* StripOutAnyComments */
384 
385 
386 
388 {
389  o << endl
390  << "Num" << "\t" << "LineNum" << "\t" << "Description" << endl;
391 
392  for (kkuint32 idx = 0; idx < formatErrors.size (); ++idx)
393  {
394  o << idx << "\t" << formatErrorsLineNums[idx] << "\t" << formatErrors[idx] << endl;
395  }
396 } /* PrintFormatErrors */
397 
398 
399 
400 
401 void Configuration::Load (const KKB::KKStr& _fileName,
402  RunLog& _log
403  )
404 {
405  fileName = _fileName;
406  LoadFile (_log);
407 }
408 
409 
410 
412 {
413  log.Level (10) << "Configuration::LoadFile: " << fileName << endl;
414 
415  kkint32 lastLineNum = 0;
416 
417  if (fileName == "")
418  {
419  log.Level (-1) << endl
420  << "Configuration::LoadFile ***ERROR*** File-Name is blank" << endl
421  << endl;
422  FormatGood (false);
423  return;
424  }
425 
426  FILE* inFile = osFOPEN (fileName.Str (), "r");
427 
428  if (!inFile)
429  {
430  log.Level (-1) << endl
431  << "Configuration::LoadFile ***ERROR*** Opening File: " << fileName << endl
432  << endl;
433 
434  FormatGood (false);
435  return;
436  }
437 
438  char buff[10240];
439  kkint32 lineCount = 0;
440 
441  curSectionName = "";
442  ConfSectionPtr curSection = NULL;
443 
444  while (fgets (buff, sizeof (buff), inFile))
445  {
446  lastLineNum++;
447  KKStr line (buff);
448  line.TrimRight ();
449  line.TrimLeft ();
450 
451  StripOutAnyComments (line);
452 
453  log.Level (70) << line << endl;
454 
455  StripOutAnyComments (line);
456 
457  if (line.Empty ())
458  {
459  // If we have a blank line, we do nothing.
460  }
461 
462  else if (line.FirstChar () == '[')
463  {
464  // Looks like definition of new section.
465 
466  if (line.LastChar () == ']')
467  {
468  curSectionName = line.SubStrPart (1, line.Len () - 2);
469  curSectionName.TrimLeft ();
470  curSectionName.TrimRight ();
471  curSectionName.Upper ();
472 
473  curSection = new ConfSection (curSectionName, lastLineNum);
474  sections->AddConfSection (curSection);
475  log.Level (30) << "LoadFile SectionName[" << curSectionName << "]." << endl;
476  }
477  else
478  {
479  log.Level (-1) << endl
480  << "Configuration::LoadFile ***ERROR*** LineNumber[" << lastLineNum << "] Improper Section Name[" << line << "]." << endl
481  << endl;
482  formatGood = false;
483  }
484  }
485 
486  else
487  {
488  if (!curSection)
489  {
490  log.Level (-1) << endl
491  << "Configuration::LoadFile ***ERROR*** Format Error LineNumber[" << lastLineNum << "]" << endl
492  << " No Section Defined." << endl
493  << endl;
494 
495  formatGood = false;
496 
497  curSectionName = "GLOBAL";
498  curSection = new ConfSection (curSectionName, lastLineNum);
499  sections->AddConfSection (curSection);
500  }
501 
502  kkint32 equalIdx = line.LocateCharacter ('=');
503 
504  if (equalIdx < 0)
505  {
506  // We have a improperly formated line.
507  log.Level (-1) << endl
508  << "Configuration::LoadFile ***ERROR*** LineNumber[" << lastLineNum << "] Improperly Formated Line[" << line << "]."
509  << endl;
510  formatGood = false;
511  }
512 
513  else
514  {
515  KKStr settingName (line.SubStrPart (0, equalIdx - 1));
516  settingName.TrimLeft ();
517  settingName.TrimRight ();
518  settingName.Upper ();
519 
520  KKStr settingValue (line.SubStrPart (equalIdx + 1));
521  settingValue.TrimLeft ();
522  settingValue.TrimRight ();
523 
524  log.Level (30) << "LoadFile SectionName[" << curSectionName << "], "
525  << "Setting[" << settingName << "], Value[" << settingValue << "]."
526  << endl;
527 
528  curSection->AddSetting (settingName, settingValue, lastLineNum);
529  }
530 
531  lineCount++;
532  }
533  }
534 
535  fclose (inFile);
536 } /* LoadFile */
537 
538 
539 
540 
542 {
543  return sections->QueueSize ();
544 }
545 
546 
547 
548 kkint32 Configuration::NumOfSettings (const KKStr& sectionName) const
549 {
550  ConfSectionPtr section = sections->LookUp (sectionName);
551 
552  if (!section)
553  return (-1);
554 
555  return section->NumOfSettings ();
556 }
557 
558 
559 
560 
562 {
563  if ((sectionNum < 0) || (sectionNum >= sections->QueueSize ()))
564  return -1;
565 
566  return sections->IdxToPtr (sectionNum) ->NumOfSettings ();
567 }
568 
569 
570 
571 
572 
573 
574 bool Configuration::SectionDefined (const KKStr& sectionName) const
575 {
576  ConfSectionPtr section = sections->LookUp (sectionName);
577  return (section != NULL);
578 }
579 
580 
581 
582 KKStrConstPtr Configuration::SectionName (kkint32 sectionNum) const
583 {
584  ConfSectionPtr section = sections->IdxToPtr (sectionNum);
585 
586  if (!section)
587  return NULL;
588  else
589  return section->Name ();
590 }
591 
592 
593 kkint32 Configuration::SectionNum (const KKStr& sectionName) const
594 {
595  if (!sections)
596  return -1;
597 
598  kkuint32 idx = 0;
599  while (idx < sections->size ())
600  {
601  if (sections->IdxToPtr(idx)->Name ()->EqualIgnoreCase (sectionName))
602  return (kkint32)idx;
603  idx++;
604  }
605  return -1;
606 }
607 
608 
609 
611 {
612  ConfSectionPtr section = sections->IdxToPtr (sectionNum);
613 
614  if (!section)
615  return -1;
616  else
617  return section->LineNum ();
618 }
619 
620 
621 
622 KKStrConstPtr Configuration::SettingName (const KKStr& sectionName,
623  kkint32 settingNum
624  ) const
625 {
626  ConfSectionPtr section = sections->LookUp (sectionName);
627  if (!section)
628  return NULL;
629 
630  return section->SettingName (settingNum);
631 }
632 
633 
634 
635 
636 KKStrConstPtr Configuration::SettingName (kkint32 sectionNum,
637  kkint32 settingNum
638  ) const
639 {
640  if ((sectionNum < 0) || (sectionNum >= sections->QueueSize ()))
641  return NULL;
642 
643  if ((settingNum < 0) || (settingNum >= (*sections)[sectionNum].NumOfSettings ()))
644  return NULL;
645 
646 
647  return sections->IdxToPtr (sectionNum)->SettingName (settingNum);
648 }
649 
650 
651 
652 KKStrConstPtr Configuration::SettingValue (kkint32 sectionNum,
653  const KKStr& settingName,
654  kkint32& lineNum
655  ) const
656 
657 {
658  KKStrConstPtr result = NULL;
659  ConfSectionPtr section = sections->IdxToPtr (sectionNum);
660  if (!section)
661  {
662  lineNum = -1;
663  }
664  else
665  {
666  result = section->LookUpValue (settingName, lineNum);
667  }
668  return result;
669 }
670 
671 
673  const KKStr& settingName,
674  kkint32& lineNum
675  ) const
676 
677 {
678  KKStrConstPtr result = NULL;
679  ConfSectionPtr section = sections->IdxToPtr (sectionNum);
680  if (!section)
681  {
682  lineNum = -1;
683  }
684  else
685  {
686  result = section->LookUpValue (settingName, lineNum);
687  }
688 
689  if (result == NULL)
690  return KKStr::EmptyStr ();
691  else
692  return KKStr (*result);
693 }
694 
695 
696 
697 
698 
699 
700 
701 KKStrConstPtr Configuration::SettingValue (kkint32 sectionNum,
702  kkint32 settingNum,
703  kkint32& lineNum
704  ) const
705 {
706  if ((sectionNum < 0) || (sectionNum >= sections->QueueSize ()))
707  return NULL;
708 
709  if ((settingNum < 0) || (settingNum >= (*sections)[sectionNum].NumOfSettings ()))
710  return NULL;
711 
712 
713  return sections->IdxToPtr (sectionNum)->SettingValue (settingNum, lineNum);
714 }
715 
716 
717 
718 
719 KKStrConstPtr Configuration::SettingValue (const KKB::KKStr& sectionName,
720  const KKB::KKStr& settingName,
721  kkint32& lineNum
722  ) const
723 {
724  kkint32 sectionNum = SectionNum (sectionName);
725  if (sectionNum < 0)
726  return NULL;
727 
728  return SettingValue (sectionNum, settingName, lineNum);
729 }
730 
731 
732 
734  const KKB::KKStr& settingName,
735  kkint32& lineNum
736  ) const
737 {
738  kkint32 sectionNum = SectionNum (sectionName);
739  if (sectionNum < 0)
740  return NULL;
741 
742  return SettingValueToStr (sectionNum, settingName, lineNum);
743 }
744 
745 
746 
747 
748 
749 void Configuration::GetSetting (const char* sectionName,
750  kkint32 settingNum,
751  KKStrConstPtr& name,
752  KKStrConstPtr& value,
753  kkint32& lineNum
754  )
755 {
756  ConfSectionPtr section = sections->LookUp (sectionName);
757  if (section)
758  {
759  section->GetSettings (settingNum, name, value, lineNum);
760  }
761  else
762  {
763  name = NULL;
764  value = NULL;
765  lineNum = -1;
766  }
767 }
768 
769 
770 
771 
773  const KKStr& error
774  )
775 {
776  formatErrors.push_back (error);
777  formatErrorsLineNums.push_back (lineNum);
778 }
779 
780 
781 
782 
783 void Configuration::FormatErrorsClear () /**< Call this to clear all format error messages. */
784 {
785  formatErrors.clear ();
786  formatErrorsLineNums.clear ();
787 }
788 
789 
790 
792 {
793  VectorKKStr errorMsgs;
794  for (kkuint32 i = 0; i < formatErrors.size (); i++)
795  {
796  KKStr lineNumStr = " ";
797  if (i < formatErrorsLineNums.size ())
798  lineNumStr = StrFormatInt (formatErrorsLineNums[i], "0000");
799  errorMsgs.push_back (lineNumStr + ":" + formatErrors[i]);
800  }
801 
802  return errorMsgs;
803 } /* FormatErrorsWithLineNumbers */
void AddConfSection(const KKStr &_name, kkint32 _lineNum)
kkint32 SectionNum(const KKB::KKStr &sectionName) const
KKStrConstPtr SettingName(kkint32 settingNum) const
KKStrConstPtr LookUpValue(const KKStr &_name, kkint32 &lineNum)
kkint32 NumOfSettings(kkint32 sectionNum) const
Returns number of settings for the specified section,.
void GetSettings(kkint32 settingNum, KKStrConstPtr &name, KKStrConstPtr &value, kkint32 &lineNum)
kkint32 MemoryConsumedEstimated() const
Definition: KKStr.cpp:766
KKStrConstPtr SectionName(kkint32 sectionNum) const
Returns the name of the section for specified index, if index not defined will return NULL...
__int32 kkint32
Definition: KKBaseTypes.h:88
bool SectionDefined(const KKB::KKStr &sectionName) const
Returns true if the section is defined.
KKStrConstPtr SettingValue(kkint32 settingNum, kkint32 &lineNum) const
Setting(const Configuration::Setting &s)
VectorKKStr FormatErrorsWithLineNumbers() const
ConfSectionPtr LookUp(const KKStr &_name)
virtual void Load(const KKB::KKStr &_fileName, RunLog &_log)
KKStr & operator=(const char *src)
Definition: KKStr.cpp:1442
KKStrConstPtr SettingValue(kkint32 sectionNum, const KKB::KKStr &settingName, kkint32 &lineNum) const
kkint32 MemoryConsumedEstimated() const
virtual kkint32 MemoryConsumedEstimated() const
bool operator==(const char *rtStr) const
Definition: KKStr.cpp:1588
ConfSection(const KKStr &_name, kkint32 _lineNum)
KKStrConstPtr SettingName(kkint32 sectionNum, kkint32 settingNum) const
bool EqualIgnoreCase(const KKStr &s2) const
Definition: KKStr.cpp:1250
unsigned __int32 kkuint32
Definition: KKBaseTypes.h:89
KKStrConstPtr SettingValue(kkint32 sectionNum, kkint32 settingNum, kkint32 &lineNum) const
void AddConfSection(ConfSectionPtr section)
kkint32 MemoryConsumedEstimated() const
Setting(const KKStr &_name, const KKStr &_value, kkint32 _lineNum)
KKStr & operator=(KKStr &&src)
Definition: KKStr.cpp:1369
kkuint32 Len() const
Returns the number of characters in the string.
Definition: KKStr.h:366
KKTHread * KKTHreadPtr
void AddSetting(SettingPtr setting)
kkint32 MemoryConsumedEstimated() const
KKStr(const KKStr &str)
Copy Constructor.
Definition: KKStr.cpp:561
kkint32 LookUpLineNum(const KKStr &name) const
kkint32 SectionLineNum(kkint32 sectionNum) const
KKStr SettingValueToStr(kkint32 sectionNum, const KKB::KKStr &settingName, kkint32 &lineNum) const
bool EqualIgnoreCase(const KKStrConstPtr s2) const
Definition: KKStr.cpp:1244
KKStrConstPtr SettingValue(const KKB::KKStr &sectionName, const KKB::KKStr &settingName, kkint32 &lineNum) const
KKStr SubStrPart(kkint32 firstChar, kkint32 lastChar) const
returns a SubString consisting of all characters starting at index &#39;firstChar&#39; and ending at &#39;lastInd...
Definition: KKStr.cpp:2802
void AddSetting(const KKStr &_name, const KKStr &_value, kkint32 _lineNum)
KKStrConstPtr Name() const
kkint32 NumOfSettings(const KKB::KKStr &sectionName) const
void PrintFormatErrors(std::ostream &o)
static KKStr Concat(const std::vector< std::string > &values)
Concatenates the list of &#39;std::string&#39; strings.
Definition: KKStr.cpp:1082
SettingPtr LookUp(const KKStr &name)
KKStr SettingValueToStr(const KKB::KKStr &sectionName, const KKB::KKStr &settingName, kkint32 &lineNum) const
static const KKStr & EmptyStr()
Static method that returns an Empty String.
Definition: KKStr.cpp:3453
General purpose Configuration File manager class.
Definition: Configuration.h:45
void GetSetting(const char *sectiopnName, kkint32 settingNum, KKStrConstPtr &name, KKStrConstPtr &value, kkint32 &lineNum)
void AddSetting(const KKStr &_name, const KKStr &_value, kkint32 _lineNum)
void StripOutAnyComments(KKStr &line)
KKStrConstPtr Value() const
const char * Str() const
Returns a pointer to a ascii string.
Definition: KKStr.h:422
FILE * osFOPEN(const char *fileName, const char *mode)
Definition: OSservices.cpp:74
Configuration(const Configuration &c)
char operator[](kkint32 i) const
Definition: KKStr.cpp:3413
KKStr & operator=(const KKStr &src)
Definition: KKStr.cpp:1390
Used for logging messages.
Definition: RunLog.h:49
ConfSection(const Configuration::ConfSection &cs)
SettingList(const SettingList &sl)
void LoadFile(RunLog &log)
void FormatErrorsAdd(kkint32 lineNum, const KKStr &error)
KKStrConstPtr SettingName(const KKB::KKStr &sectionName, kkint32 settingNum) const
void FormatGood(bool _formatGood)
Definition: Configuration.h:66
Configuration(const KKB::KKStr &_fileName, RunLog &_log)
VectorKKStr(const VectorKKStr &v)
Definition: KKStr.cpp:5270
void FormatErrorsClear()
Call this to clear all format error messages.