Advertisement
Guest User

Simple cfg Parser

a guest
Nov 8th, 2014
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.57 KB | None | 0 0
  1. /*==========================================
  2. scfgpars.h
  3. ===========================================*/
  4. #ifndef SCFGPARS_H_INCLUDED
  5. #define SCFGPARS_H_INCLUDED
  6.  
  7. #include <iostream>
  8. #include <fstream>
  9. #include <sys/stat.h>
  10. #include <map>
  11. #include <sstream>
  12.  
  13. class scfgPars
  14. {
  15. public:
  16.     scfgPars();
  17.     void load(const std::string);
  18.  
  19.     void setEntry(std::string, std::string);
  20.     int getInt(const std::string, int);
  21.     bool getBool(const std::string, bool);
  22.     std::string getString(const std::string, std::string);
  23.  
  24. private:
  25.     void runTest();
  26.     bool fileExists(const std::string&);
  27.     bool isInt(const std::string&);
  28.     bool isBool(const std::string&);
  29.     std::string intToString(int);
  30.     std::string boolToString(bool);
  31.     int stringToInt(std::string);
  32.     bool stringToBool(std::string);
  33.     unsigned int findIdLine(const std::string);
  34.     void getFileData();
  35.  
  36. private:
  37.     std::ifstream iFile;
  38.     std::ofstream oFile;
  39.     std::map <std::string, std::pair<std::string, int> > cfgEntries;
  40.     std::map <std::string, std::pair<std::string, int> >::iterator entriesIt;
  41.     std::map <int, std::string> cfgFile;
  42.     std::map <int, std::string>::iterator fileIt;
  43.     std::string line;
  44.     const char * charFileName;
  45.  
  46. };
  47.  
  48. #endif // SCFGPARS_H_INCLUDED
  49.  
  50.  
  51.  
  52.  
  53. /*==========================================
  54. scfgpars.cpp
  55. ===========================================*/
  56. #include "scfgPars.h"
  57.  
  58. //========================= main functions =========================
  59. scfgPars::scfgPars()
  60. {
  61.  
  62. }
  63.  
  64. void scfgPars::load(const std::string filename)
  65. {
  66.     charFileName = filename.c_str();
  67.  
  68.     if(!fileExists(filename))
  69.     {
  70.         oFile.open(charFileName);
  71.         oFile.close();
  72.     }
  73.     iFile.open(charFileName);
  74.     getFileData();
  75.     std::cout << "Configuration file loaded" << std::endl;
  76.     runTest();
  77. }
  78.  
  79.  
  80. //========================= utility functions =========================
  81. void scfgPars::runTest()
  82. {
  83.  
  84.     setEntry("dub", "dub5");
  85.     setEntry("settest2", "test");
  86.  
  87.     std::string strtest = getString("strtest1", "strtest");
  88.     int inttest = getInt("inttest1", 42);
  89.     bool booltest = getBool("booltest1", "true");
  90.  
  91.     for(entriesIt=cfgEntries.begin(); entriesIt!=cfgEntries.end(); ++entriesIt)
  92.     {
  93.         std::cout << "line: " << entriesIt->second.second << "\t\t" << entriesIt->first << " = " << entriesIt->second.first << std::endl;
  94.     }
  95.  
  96.     std::cout << "====================================================================" << std::endl;
  97.  
  98.     for(fileIt=cfgFile.begin(); fileIt!=cfgFile.end(); ++fileIt)
  99.     {
  100.         std::cout << "line: " << fileIt->first << "\t\t" << fileIt->second << std::endl;
  101.     }
  102. }
  103.  
  104. bool scfgPars::fileExists(const std::string& filename)
  105. {
  106.     struct stat buf;
  107.     if (stat(filename.c_str(), &buf) != -1)
  108.     {
  109.         return true;
  110.     }
  111.     return false;
  112.  
  113. }
  114.  
  115. bool scfgPars::isInt(const std::string& s)
  116. {
  117.     std::string::const_iterator it = s.begin();
  118.     while (it != s.end() && std::isdigit(*it)) ++it;
  119.     return !s.empty() && it == s.end();
  120. }
  121.  
  122. bool scfgPars::isBool(const std::string& s)
  123. {
  124.     return s == "true" || s == "false";
  125. }
  126.  
  127. std::string scfgPars::intToString(int i)
  128. {
  129.     std::ostringstream temp;
  130.     temp << i;
  131.     return temp.str();
  132. }
  133.  
  134. std::string scfgPars::boolToString(bool b)
  135. {
  136.     if(b == true)
  137.         return "true";
  138.     else
  139.         return "false";
  140. }
  141.  
  142. int scfgPars::stringToInt(std::string str)
  143. {
  144.     std::stringstream temp( str );
  145.     int i;
  146.     temp >> i;
  147.     if (temp.fail())
  148.     {
  149.         std::cout << "fatal error: could not convert string to int";
  150.         return 0;
  151.     }
  152.     else
  153.     {
  154.         return i;
  155.     }
  156. }
  157.  
  158. bool scfgPars::stringToBool(std::string str)
  159. {
  160.     if(str == "true")
  161.         return true;
  162.     else
  163.         return false;
  164. }
  165. //========================= file parser =========================
  166. void scfgPars::getFileData()
  167. {
  168.  
  169.     std::string* buffer;
  170.     std::string id, value;
  171.     int lineNumber = 1;
  172.  
  173.     while(std::getline(iFile, line))
  174.     {
  175.  
  176.         cfgFile [lineNumber] = line;
  177.  
  178.         if(line.find("=") != std::string::npos && line.at(0) != '=')
  179.         {
  180.             buffer = &id;
  181.             int Ecounter = 0; // equals counter
  182.             id.clear();
  183.             value.clear();
  184.  
  185.             for (unsigned i=0; i<line.length(); ++i)
  186.             {
  187.                 char lineChar = line.at(i);
  188.  
  189.                 if(lineChar == '=')
  190.                 {
  191.                     Ecounter++;
  192.                     buffer = &value;
  193.                 }
  194.  
  195.                 if(Ecounter > 1) break;
  196.  
  197.                 if(lineChar != ' ' && lineChar != '=')
  198.                     *buffer += lineChar;
  199.             }
  200.  
  201.             if(Ecounter == 1)
  202.                 cfgEntries [id] = std::make_pair(value, lineNumber);
  203.         }
  204.         lineNumber++;
  205.     }
  206. }
  207.  
  208. //========================= get and set functions =========================
  209. void scfgPars::setEntry(std::string id, std::string value)
  210. {
  211.     int lineNumber = 0;
  212.     if (cfgEntries.count(id) == 1)
  213.         lineNumber = cfgEntries[id].second;
  214.     else
  215.         lineNumber = cfgFile.end()->first +1;
  216.  
  217.     cfgEntries [id] = std::make_pair(value, lineNumber);
  218.     cfgFile [lineNumber] = id + " = " + value;
  219.  
  220.     oFile.open(charFileName);
  221.     for(fileIt=cfgFile.begin(); fileIt!=cfgFile.end(); ++fileIt)
  222.     {
  223.  
  224.         oFile << fileIt->second << std::endl;
  225.     }
  226.     oFile.close();
  227. }
  228.  
  229. int scfgPars::getInt(const std::string id, int dint)
  230. {
  231.     if(cfgEntries.count(id) == 1)
  232.     {
  233.         const std::string output = cfgEntries.find(id)->second.first;
  234.         if(!isInt(output))
  235.         {
  236.             setEntry(id, intToString(dint));
  237.             return dint;
  238.         }
  239.         else
  240.         {
  241.             return stringToInt(output);
  242.         }
  243.     }
  244.     else
  245.     {
  246.         setEntry(id, intToString(dint));
  247.         return dint;
  248.     }
  249. }
  250.  
  251. bool scfgPars::getBool(const std::string id, bool dbool)
  252. {
  253.     if(cfgEntries.count(id) == 1)
  254.     {
  255.         const std::string output = cfgEntries.find(id)->second.first;
  256.         if(!isBool(output))
  257.         {
  258.             setEntry(id, boolToString(dbool));
  259.             return dbool;
  260.         }
  261.         else
  262.         {
  263.             return stringToBool(output);
  264.         }
  265.     }
  266.     else
  267.     {
  268.         setEntry(id, boolToString(dbool));
  269.         return dbool;
  270.     }
  271. }
  272.  
  273. std::string scfgPars::getString(const std::string id, std::string dstring)
  274. {
  275.     if(cfgEntries.count(id) == 1)
  276.     {
  277.         return cfgEntries.find(id)->second.first;
  278.     }
  279.     else
  280.     {
  281.         setEntry(id, dstring);
  282.         return dstring;
  283.     }
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement