home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Freeware / Utilitare / VisualBoyAdvance-1.7.2 / src / gtk / configfile.cpp next >
Encoding:
C/C++ Source or Header  |  2004-05-13  |  5.2 KB  |  263 lines

  1. // VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
  2. // Copyright (C) 1999-2003 Forgotten
  3. // Copyright (C) 2004 Forgotten and the VBA development team
  4.  
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2, or(at your option)
  8. // any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software Foundation,
  17. // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18.  
  19. #include "configfile.h"
  20.  
  21. #include <string.h>
  22. #include <glib.h>
  23.  
  24. #include <glibmm/fileutils.h>
  25. #include <glibmm/iochannel.h>
  26.  
  27. namespace VBA
  28. {
  29. namespace Config
  30. {
  31.  
  32. using std::string;
  33. using Glib::IOChannel;
  34.  
  35. Line::Line(const string & _rsKey, const string & _rsValue) :
  36.   m_sKey(_rsKey),
  37.   m_sValue(_rsValue)
  38. {
  39. }
  40.  
  41. Section::Section(const string & _rsName) :
  42.   m_sName(_rsName)
  43. {
  44. }
  45.  
  46. bool Section::bKeyExists(const string & _rsKey)
  47. {
  48.   for (iterator it = begin(); it != end(); it++)
  49.   {
  50.     if (it->m_sKey == _rsKey)
  51.     {
  52.       return true;
  53.     }
  54.   }
  55.   return false;
  56. }
  57.  
  58. void Section::vSetKey(const string & _rsKey, const string & _rsValue)
  59. {
  60.   for (iterator it = begin(); it != end(); it++)
  61.   {
  62.     if (it->m_sKey == _rsKey)
  63.     {
  64.       it->m_sValue = _rsValue;
  65.       return;
  66.     }
  67.   }
  68.   push_back(Line(_rsKey, _rsValue));
  69. }
  70.  
  71. string Section::sGetKey(const string & _rsKey) const
  72. {
  73.   for (const_iterator it = begin(); it != end(); it++)
  74.   {
  75.     if (it->m_sKey == _rsKey)
  76.     {
  77.       return it->m_sValue;
  78.     }
  79.   }
  80.   throw KeyNotFound(m_sName, _rsKey);
  81. }
  82.  
  83. void Section::vRemoveKey(const string & _rsKey)
  84. {
  85.   for (iterator it = begin(); it != end(); it++)
  86.   {
  87.     if (it->m_sKey == _rsKey)
  88.     {
  89.       erase(it);
  90.       return;
  91.     }
  92.   }
  93. }
  94.  
  95. File::File()
  96. {
  97. }
  98.  
  99. File::File(const string & _rsFile)
  100. {
  101.   vLoad(_rsFile);
  102. }
  103.  
  104. File::~File()
  105. {
  106. }
  107.  
  108. bool File::bSectionExists(const string & _rsName)
  109. {
  110.   for (iterator it = begin(); it != end(); it++)
  111.   {
  112.     if (it->sGetName() == _rsName)
  113.     {
  114.       return true;
  115.     }
  116.   }
  117.   return false;
  118. }
  119.  
  120. Section * File::poAddSection(const string & _rsName)
  121. {
  122.   Section * poSection = NULL;
  123.   for (iterator it = begin(); it != end(); it++)
  124.   {
  125.     if (it->sGetName() == _rsName)
  126.     {
  127.       poSection = &(*it);
  128.     }
  129.   }
  130.   if (poSection == NULL)
  131.   {
  132.     push_back(Section(_rsName));
  133.     poSection = &back();
  134.   }
  135.   return poSection;
  136. }
  137.  
  138. Section * File::poGetSection(const string & _rsName)
  139. {
  140.   for (iterator it = begin(); it != end(); it++)
  141.   {
  142.     if (it->sGetName() == _rsName)
  143.     {
  144.       return &(*it);
  145.     }
  146.   }
  147.   throw SectionNotFound(_rsName);
  148. }
  149.  
  150. void File::vRemoveSection(const string & _rsName)
  151. {
  152.   for (iterator it = begin(); it != end(); it++)
  153.   {
  154.     if (it->sGetName() == _rsName)
  155.     {
  156.       erase(it);
  157.       return;
  158.     }
  159.   }
  160. }
  161.  
  162. void File::vLoad(const string & _rsFile,
  163.                  bool _bAddSection,
  164.                  bool _bAddKey)
  165. {
  166.   string sBuffer = Glib::file_get_contents(_rsFile);
  167.   Section * poSection = NULL;
  168.   char ** lines = g_strsplit(sBuffer.c_str(), "\n", 0);
  169.   char * tmp;
  170.   int i = 0;
  171.   while (lines[i])
  172.   {
  173.     if (lines[i][0] == '[')
  174.     {
  175.       if ((tmp = strchr(lines[i], ']')))
  176.       {
  177.         *tmp = '\0';
  178.         if (_bAddSection)
  179.         {
  180.           poSection = poAddSection(&lines[i][1]);
  181.         }
  182.         else
  183.         {
  184.           try
  185.           {
  186.             poSection = poGetSection(&lines[i][1]);
  187.           }
  188.           catch (...)
  189.           {
  190.             poSection = NULL;
  191.           }
  192.         }
  193.       }
  194.     }
  195.     else if (lines[i][0] != '#' && poSection != NULL)
  196.     {
  197.       if ((tmp = strchr(lines[i], '=')))
  198.       {
  199.         *tmp = '\0';
  200.         tmp++;
  201.         if (_bAddKey || poSection->bKeyExists(lines[i]))
  202.         {
  203.           poSection->vSetKey(lines[i], tmp);
  204.         }
  205.       }
  206.     }
  207.     i++;
  208.   }
  209.   g_strfreev(lines);
  210. }
  211.  
  212. void File::vSave(const string & _rsFile)
  213. {
  214.   Glib::RefPtr<IOChannel> poFile = IOChannel::create_from_file(_rsFile, "w");
  215.   poFile->set_encoding("");
  216.  
  217.   for (const_iterator poSection = begin();
  218.        poSection != end();
  219.        poSection++)
  220.   {
  221.     string sName = "[" + poSection->sGetName() + "]\n";
  222.     poFile->write(sName);
  223.  
  224.     for (Section::const_iterator poLine = poSection->begin();
  225.          poLine != poSection->end();
  226.          poLine++)
  227.     {
  228.       string sLine = poLine->m_sKey + "=" + poLine->m_sValue + "\n";
  229.       poFile->write(sLine);
  230.     }
  231.     poFile->write("\n");
  232.   }
  233. }
  234.  
  235. void File::vClear()
  236. {
  237.   clear();
  238. }
  239.  
  240. std::ostream & operator<<(std::ostream & _roOut, const File & _roFile)
  241. {
  242.   for (File::const_iterator poSection = _roFile.begin();
  243.        poSection != _roFile.end();
  244.        poSection++)
  245.   {
  246.     string sName = "[" + poSection->sGetName() + "]\n";
  247.     _roOut << sName;
  248.  
  249.     for (Section::const_iterator poLine = poSection->begin();
  250.          poLine != poSection->end();
  251.          poLine++)
  252.     {
  253.       string sLine = poLine->m_sKey + "=" + poLine->m_sValue + "\n";
  254.       _roOut << sLine;
  255.     }
  256.     _roOut << "\n";
  257.   }
  258.   return _roOut;
  259. }
  260.  
  261. } // namespace Config
  262. } // namespace VBA
  263.