sintonia/library/ecasound-2.7.2/libecasound/resource-file.cpp

178 lines
4.6 KiB
C++

// ------------------------------------------------------------------------
// resource-file.cpp: Generic resource file class
// Copyright (C) 1999-2004,2007 Kai Vehmanen
//
// Attributes:
// eca-style-version: 3
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ------------------------------------------------------------------------
#include <string>
#include <cstdlib>
#include <fstream>
#include <kvu_utils.h>
#include "resource-file.h"
#include "eca-logger.h"
RESOURCE_FILE::RESOURCE_FILE(const std::string& resource_file) :
resfile_rep(resource_file)
{
if (resfile_rep.size() > 0)
load();
}
RESOURCE_FILE::~RESOURCE_FILE(void)
{
}
void RESOURCE_FILE::load(void)
{
ECA_LOG_MSG(ECA_LOGGER::functions, "Loading file " + resfile_rep + ".");
lines_rep.resize(0);
std::ifstream fin (resfile_rep.c_str());
if (fin) {
std::string line;
std::string first, second;
while(getline(fin,line)) {
if (line.size() > 0 && line[0] == '#') {
lines_rep.push_back(line);
continue;
}
std::string::size_type n = line.find_first_of("=");
if (n == std::string::npos) n = line.find_first_of(" ");
if (n == std::string::npos) {
continue;
}
first = std::string(line, 0, n);
second = std::string(line, n + 1, std::string::npos);
/* step: combine multi-line values ending with '\' into
* a single value for 'first' */
first = kvu_remove_surrounding_spaces(first);
second = kvu_remove_surrounding_spaces(second);
std::string::iterator p = second.end();
--p;
while (second.begin() != second.end() && *p == '\\') {
second.erase(p);
lines_rep.push_back(line);
if (getline(fin, line)) {
line = kvu_remove_surrounding_spaces(line);
second += line;
p = second.end();
--p;
}
else
break;
}
// std::cerr << "found key-value pair: " +
// first + " = \"" + second + "\"." << std::endl;
resmap_rep[first] = second;
lines_rep.push_back(line);
}
}
fin.close();
modified_rep = false;
}
void RESOURCE_FILE::save(void)
{
ECA_LOG_MSG(ECA_LOGGER::user_objects, "Saving file " + resfile_rep + ".");
std::ofstream fout (resfile_rep.c_str(), std::ios::out | std::ios::trunc);
if (fout) {
std::vector<std::string>::const_iterator p = lines_rep.begin();
while(p != lines_rep.end()) {
if (p->size() > 0) {
// cerr << "Writing line: " << *p << "." << endl;
fout << *p << "\n";
}
++p;
}
}
fout.close();
modified_rep = false;
}
std::vector<std::string> RESOURCE_FILE::keywords(void) const
{
std::vector<std::string> keys;
std::map<std::string,std::string>::const_iterator p;
p = resmap_rep.begin();
while(p != resmap_rep.end()) {
// cerr << "Adding keyword: " << p->first << "." << endl;
keys.push_back(p->first);
++p;
}
return keys;
}
bool RESOURCE_FILE::boolean_resource(const std::string& tag) const
{
if (resource(tag) == "true") return true;
return false;
}
bool RESOURCE_FILE::has(const std::string& tag) const
{
if (resmap_rep.find(tag) == resmap_rep.end())
return false;
return true;
}
std::string RESOURCE_FILE::resource(const std::string& tag) const
{
if (has(tag) != true)
return "";
// cerr << "Returning resource: " << resmap_rep[tag] << "." << endl;
return resmap_rep[tag];
}
void RESOURCE_FILE::resource(const std::string& tag, const std::string& value)
{
resmap_rep[tag] = value;
bool found = false;
std::vector<std::string>::iterator p;
p = lines_rep.begin();
while(p != lines_rep.end()) {
std::string line = *p;
if (line.size() > 0 && line[0] != '#') {
std::string::size_type n = line.find_first_of("=");
if (n == std::string::npos) n = line.find_first_of(" ");
if (n != std::string::npos) {
std::string first = kvu_remove_surrounding_spaces(std::string(line, 0, n));
if (first == tag) {
*p = first + " = " + value;
found = true;
}
}
}
++p;
}
if (found != true) {
lines_rep.push_back(tag + " = " + value);
}
modified_rep = true;
}