Files
pip/piconfig.cpp
2011-03-01 06:07:16 +03:00

260 lines
8.4 KiB
C++

#include "piconfig.h"
PIConfig::PIConfig(const PIString & path, Flags<Mode> mode): PIFile(path, mode) {
if (!isOpened() && (mode[Write] || mode[New]))
open(path, Read | Write | New);
parse();
}
PIStringList PIConfig::getValue(const PIString & vname, const PIStringList & def, bool * exist) const {
return getValue(vname, def.join("%|%"), exist).split("%|%");}
bool PIConfig::getValue(const PIString & vname, const bool def, bool * exist) const {
return atob(getValue(vname, btos(def), exist));}
char PIConfig::getValue(const PIString & vname, const char def, bool * exist) const {
return getValue(vname, PIString(def), exist)[0];}
short PIConfig::getValue(const PIString & vname, const short def, bool * exist) const {
return getValue(vname, itos(def), exist).toShort();}
int PIConfig::getValue(const PIString & vname, const int def, bool * exist) const {
return getValue(vname, itos(def), exist).toInt();}
long PIConfig::getValue(const PIString & vname, const long def, bool * exist) const {
return getValue(vname, ltos(def), exist).toLong();}
uchar PIConfig::getValue(const PIString & vname, const uchar def, bool * exist) const {
return getValue(vname, uitos(def), exist).toInt();}
ushort PIConfig::getValue(const PIString & vname, const ushort def, bool * exist) const {
return getValue(vname, uitos(def), exist).toShort();}
uint PIConfig::getValue(const PIString & vname, const uint def, bool * exist) const {
return getValue(vname, uitos(def), exist).toInt();}
ulong PIConfig::getValue(const PIString & vname, const ulong def, bool * exist) const {
return getValue(vname, ultos(def), exist).toLong();}
float PIConfig::getValue(const PIString & vname, const float def, bool * exist) const {
return getValue(vname, ftos(def), exist).toFloat();}
double PIConfig::getValue(const PIString & vname, const double def, bool * exist) const {
return getValue(vname, dtos(def), exist).toDouble();}
void PIConfig::setValue(const PIString & name, const PIStringList & value, bool write) {
setValue(name, value.join("%|%"), "l", write);}
void PIConfig::setValue(const PIString & name, const char * value, bool write) {
setValue(name, PIString(value), "s", write);}
void PIConfig::setValue(const PIString & name, const bool value, bool write) {
setValue(name, btos(value), "b", write);}
void PIConfig::setValue(const PIString & name, const char value, bool write) {
setValue(name, PIString(1, value), "s", write);}
void PIConfig::setValue(const PIString & name, const short value, bool write) {
setValue(name, itos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const int value, bool write) {
setValue(name, itos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const long value, bool write) {
setValue(name, ltos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const uchar value, bool write) {
setValue(name, uitos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const ushort value, bool write) {
setValue(name, uitos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const uint value, bool write) {
setValue(name, uitos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const ulong value, bool write) {
setValue(name, ultos(value), "n", write);}
void PIConfig::setValue(const PIString & name, const float value, bool write) {
setValue(name, ftos(value), "f", write);}
void PIConfig::setValue(const PIString & name, const double value, bool write) {
setValue(name, dtos(value), "f", write);}
PIString PIConfig::getValue(const PIString & vname, const PIString & def, bool * exist) const {
for (uint i = 0; i < settname.size(); i++) {
if (settname[i] == vname) {
if (exist != 0) *exist = true;
return settval[i];
}
}
if (exist != 0) *exist = false;
return def;
}
void PIConfig::setValue(const PIString & name, const PIString & value, const PIString & type, bool write) {
int number = getNumber(name);
if (number == -1) {
addLine(name, value, type);
return;
}
PIString tmp = settname[number] + " = " + value + " #" + setttype[number] + " " + settcom[number];
settval[number] = value;
all[settlines[number]] = tmp;
if (write) writeAll();
}
bool PIConfig::existsValue(const PIString & name) {
for (uint i = 0; i < settname.size(); i++)
if (settname[i] == name) return true;
return false;
}
void PIConfig::addLine(const PIString & name, const PIString & value, const PIString & type) {
if (setttab.size() > 0) *this << setttab[setttab.size() - 1] << name << " = " << value << " #" << type << "\n";
else *this << name << " = " << value << " #" << type << "\n";
settname.push_back(name);
settval.push_back(value);
settcom.push_back("");
setttype.push_back(type);
if (setttab.size() > 0) setttab.push_back(setttab[setttab.size() - 1]);
else setttab.push_back("\t");
settlines.push_back(all.size());
all.push_back(name + " = " + value + " #" + type);
flush();
}
void PIConfig::insertLine(uint number, const PIString & name, const PIString & value, const PIString & type) {
if (number >= settname.size()) {
addLine(name, value, type);
return;
}
settname.insert(number, name);
settval.insert(number, value);
settcom.insert(number, "");
setttab.insert(number, setttab[number]);
setttype.insert(number, type);
settlines.insert(number, settlines[number]);
for (uint i = number + 1; i < settlines.size(); i++) settlines[i]++;
all.insert(settlines[number], name + " = " + value + " #" + type);
flush();
writeAll();
}
int PIConfig::getNumber(const PIString & name) {
for (uint i = 0; i < settname.size(); i++)
if (settname[i] == name)
return i;
return -1;
}
void PIConfig::setValue(uint number, const PIString & value, bool write) {
PIString tmp = settname[number] + " = " + value + " #" + setttype[number] + " " + settcom[number];
settval[number] = value;
all[settlines[number]] = tmp;
if (write) writeAll();
}
void PIConfig::setName(uint number, const PIString & name) {
PIString tmp = name + " = " + settval[number] + " #" + setttype[number] + " " + settcom[number];
settname[number] = name;
all[settlines[number]] = tmp;
writeAll();
}
void PIConfig::setType(uint number, const PIString & type) {
PIString tmp = settname[number] + " = " + settval[number] + " #" + type + " " + settcom[number];
setttype[number] = type;
all[settlines[number]] = tmp;
writeAll();
}
void PIConfig::setComment(uint number, const PIString & comment) {
PIString tmp = settname[number] + " = " + settval[number] + " #" + setttype[number] + " " + comment;
settcom[number] = comment;
all[settlines[number]] = tmp;
writeAll();
}
void PIConfig::deleteLine(const PIString & name) {
bool exist = false;
uint i;
for (i = 0; i < settname.size(); i++) {
if (settname[i] == name) {
exist = true;
break;
}
}
if (!exist) return;
deleteLine(i);
}
void PIConfig::deleteLine(uint number) {
settname.erase(settname.begin() + number);
settval.erase(settval.begin() + number);
settcom.erase(settcom.begin() + number);
setttab.erase(setttab.begin() + number);
setttype.erase(setttype.begin() + number);
all.erase(all.begin() + settlines[number]);
for (uint i = number; i < settlines.size(); i++) settlines[i]--;
settlines.erase(settlines.begin() + number);
writeAll();
}
void PIConfig::writeAll() {
clear();
uint c = 0;
for (uint i = 0; i < all.size() - 1; i++) {
if (c < settlines.size() && c < setttab.size()) {
if (settlines[c] == i) {
*this << setttab[c];
c++;
}
}
*this << all[i] << "\n";
}
readAll();
}
void PIConfig::readAll() {
settname.clear();
settval.clear();
settcom.clear();
setttab.clear();
settlines.clear();
setttype.clear();
all.clear();
flush();
parse();
}
void PIConfig::parse() {
PIString str, tab, comm;
int ind, sind;
if (!isOpened()) return;
seek(0);
lines = 0;
while (!isEnd()) {
str = readLine();
//cout << str << endl;
tab = str.left(str.find(str.trimmed().left(1)));
str.trim();
all.push_back(str);
ind = str.find('=');
if ((ind > 0) && !(str[0] == '#')) {
sind = str.find('#');
if (sind > 0) {
comm = str.right(str.size() - sind - 1).trimmed();
if (comm.length() > 0) setttype.push_back(comm[0]);
else setttype.push_back("s");
comm = comm.right(comm.size() - 1).trimmed();
settcom.push_back(comm);
str = str.left(sind);
} else {
setttype.push_back("s");
settcom.push_back("");
}
settname.push_back(str.left(ind).trimmed());
settval.push_back(str.right(str.size() - ind - 1).trimmed());
setttab.push_back(tab);
settlines.push_back(lines);
}
lines++;
}
}