zengine/src/ZE_ZConfigFile.cpp

327 lines
9.1 KiB
C++
Raw Normal View History

/*******************************************************************************
This file is Part of the ZEngine Library for SDL Game Development.
Copyright (C) 2002 ConceptOfZero.net
Licensed under the BSD License, see licensing.txt.
The maintainer of this library is James Turk (james@conceptofzero.net)
and the home of this Library is http://www.conceptofzero.net/
*******************************************************************************/
/*!
\par File Header:
File: ZE_ZConfigFile.cpp <br>
Description: Implementation source file for ZConfigFile, the ZEngine INI-Style Config File. <br>
Author(s): James Turk <br>
$Id: ZE_ZConfigFile.cpp,v 1.2 2002/12/01 07:56:17 cozman Exp $<br>
\file ZE_ZConfigFile.cpp
\brief Source file for ZConfigFile.
Implementation of ZConfigFile, the ZEngine INI-Style Config File.
**/
#include "ZE_ZConfigFile.h"
namespace ZE
{
string ZConfigFile::CleanString(string str)
{
string tmpStr;
bool inQuotes = false;
//cycle through, only copy spaces and if a character is uppercase, convert it to lowercase
for(string::size_type i = 0; i < str.length(); i++)
{
if(!isspace(str[i]) || inQuotes)
{
if(str[i] == '\"')
inQuotes = !inQuotes;
if(isupper(str[i]) && !inQuotes)
str[i] = static_cast<char>(tolower(str[i]));
tmpStr += str[i];
}
}
return tmpStr;
}
bool ZConfigFile::Exists(string sec)
{
list<ZCF_Section>::iterator secIter;
sec = CleanString(sec);
for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++)
{
if(CleanString((*secIter).section) == sec)
return true;
}
return false;
}
bool ZConfigFile::Exists(string sec, string var)
{
list<ZCF_Section>::iterator secIter;
list<ZCF_Variable>::iterator varIter;
sec = CleanString(sec);
var = CleanString(var);
for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++)
{
if(CleanString((*secIter).section) == sec)
{
for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++)
{
if(CleanString((*varIter).var) == var)
return true;
}
}
}
return false;
}
void ZConfigFile::SetVariable(string sec, string var, string val)
{
list<ZCF_Section>::iterator secIter;
list<ZCF_Variable>::iterator varIter;
if(Exists(CleanString(sec)))
{
sec = CleanString(sec);
for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++)
{
if(CleanString((*secIter).section) == sec) //if this is the section
{
if(Exists(sec,var))
{
var = CleanString(var);
for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++)
{
if(CleanString((*varIter).var) == var) //if this is the variable
{
(*varIter).val = val;
break; //break from this loop
}
}
break; //done in the for loop, time to go
}
else
{
ZCF_Variable tempVar;
tempVar.var = var;
(*secIter).varList.push_back(tempVar);
SetVariable(sec,var,val);
}
}
}
}
else
{
ZCF_Section tempSec;
tempSec.section = sec;
mFileLayout.push_back(tempSec);
SetVariable(sec,var,val);
}
}
string ZConfigFile::GetVariable(string sec, string var, string defVal)
{
list<ZCF_Section>::iterator secIter;
list<ZCF_Variable>::iterator varIter;
sec = CleanString(sec);
var = CleanString(var);
if(Exists(sec))
{
for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++)
{
if(CleanString((*secIter).section) == sec) //if this is the section
{
if(Exists(sec,var))
{
for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++)
{
if(CleanString((*varIter).var) == var) //if this is the variable
return (*varIter).val; //return now
}
break; //done in the for loop, time to go
}
else
{
return defVal;
break;
}
}
}
}
return defVal; //if it gets to the end just return the default
}
ZConfigFile::ZConfigFile() {}
ZConfigFile::ZConfigFile(string mFilename)
{
Process(mFilename);
}
ZConfigFile::~ZConfigFile()
{
Close();
}
void ZConfigFile::Process(string filename)
{
mFilename = filename;
ifstream cfile(mFilename.c_str());
string section, str, var, tmp;
mFileLayout.clear();
while(!cfile.eof() && cfile.is_open())
{
getline(cfile,str); //read in a line
tmp = CleanString(str); //get a clean version
//if string is bracketed it is a section, if it begins in a letter it is a variable
if(tmp[0] == '[' && tmp[tmp.length()-1] == ']')
section = str;
else if(isalpha(tmp[0]))
{
var = str.substr(0,str.find('=')); //split the string at the equals sign
SetVariable(section,var,str.substr(str.find('=')+1,str.length()-var.length()-1));
}
}
cfile.close();
}
int ZConfigFile::GetInt(string section, string var, int defVal)
{
string val;
char tmp[20];
section = CleanString(section);
var = CleanString(var);
section = '[' + section + ']';
sprintf(tmp,"%d",defVal);
val = GetVariable(section,var,tmp);
if(!atoi(val.c_str()) && val[0] !='0') //if it is zero but doesn't start with a zero
return defVal;
else
return atoi(val.c_str());
}
bool ZConfigFile::GetBool(string section, string var, bool defVal)
{
string val,tmp;
section = CleanString(section);
var = CleanString(var);
section = '[' + section + ']';
tmp = defVal ? "true" : "false";
val = CleanString(GetVariable(section,var,tmp));
if(val == "true" || val == "1")
return true;
else if(val == "false" || val == "0")
return false;
else
return defVal;
}
string ZConfigFile::GetString(string section, string var, string defVal)
{
string val;
section = CleanString(section);
var = CleanString(var);
section = '[' + section + ']';
val = CleanString(GetVariable(section,var,defVal));
if(val == CleanString(defVal))
val = defVal;
if(val[0] == '\"' && val[val.length()-1] == '\"')
return val.substr(1,val.length()-2); //chop off quotes
else
return val;
}
void ZConfigFile::SetInt(string section, string var, int val)
{
char buf[20];
sprintf(buf,"%d",val);
section = '[' + section + ']';
SetVariable(section,var,buf);
}
void ZConfigFile::SetBool(string section, string var, bool val)
{
string tmp = val ? "true" : "false";
section = '[' + section + ']';
SetVariable(section,var,tmp);
}
void ZConfigFile::SetString(string section, string var, string val)
{
section = '[' + section + ']';
val = "\"" + val + "\"";
SetVariable(section,var,val);
}
void ZConfigFile::Flush()
{
list<ZCF_Section>::iterator secIter;
list<ZCF_Variable>::iterator varIter;
string secName;
//in case the filename is already cleared somehow
if(mFilename.length())
{
ofstream cfile(mFilename.c_str(), ios::out|ios::trunc);
if(cfile)
{
//iteration through sections
for(secIter = mFileLayout.begin(); secIter != mFileLayout.end(); secIter++)
{
//ensure that section is valid
secName = CleanString((*secIter).section);
if(secName.length() && secName[0] == '[' && secName[secName.length()-1] == ']')
{
cfile << (*secIter).section << endl; //write out raw section title
//for each variable in section, write out variable=value
for(varIter = (*secIter).varList.begin(); varIter != (*secIter).varList.end(); varIter++)
{
if(CleanString((*varIter).var).length()) //ensures that variable is valid
cfile << (*varIter).var << '=' << (*varIter).val << endl;
}
}
}
cfile.close();
}
}
}
void ZConfigFile::Close()
{
Flush();
mFilename = "";
}
}