136 lines
2.8 KiB
C++
136 lines
2.8 KiB
C++
|
#include "Values.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <cstdio>
|
||
|
|
||
|
|
||
|
// =====================================================================================
|
||
|
StringResource::StringResource(const SourcePos& p, const string& f, const Configuration& c,
|
||
|
const string& i, int ix, XMLNode* v, const int ve, const string& vs,
|
||
|
const string& cmnt)
|
||
|
:pos(p),
|
||
|
file(f),
|
||
|
config(c),
|
||
|
id(i),
|
||
|
index(ix),
|
||
|
value(v),
|
||
|
version(ve),
|
||
|
versionString(vs),
|
||
|
comment(cmnt)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
StringResource::StringResource()
|
||
|
:pos(),
|
||
|
file(),
|
||
|
config(),
|
||
|
id(),
|
||
|
index(-1),
|
||
|
value(NULL),
|
||
|
version(),
|
||
|
versionString(),
|
||
|
comment()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
StringResource::StringResource(const StringResource& that)
|
||
|
:pos(that.pos),
|
||
|
file(that.file),
|
||
|
config(that.config),
|
||
|
id(that.id),
|
||
|
index(that.index),
|
||
|
value(that.value),
|
||
|
version(that.version),
|
||
|
versionString(that.versionString),
|
||
|
comment(that.comment)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
int
|
||
|
StringResource::Compare(const StringResource& that) const
|
||
|
{
|
||
|
if (file != that.file) {
|
||
|
return file < that.file ? -1 : 1;
|
||
|
}
|
||
|
if (id != that.id) {
|
||
|
return id < that.id ? -1 : 1;
|
||
|
}
|
||
|
if (index != that.index) {
|
||
|
return index - that.index;
|
||
|
}
|
||
|
if (config != that.config) {
|
||
|
return config < that.config ? -1 : 1;
|
||
|
}
|
||
|
if (version != that.version) {
|
||
|
return version < that.version ? -1 : 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
string
|
||
|
StringResource::TypedID() const
|
||
|
{
|
||
|
string result;
|
||
|
if (index < 0) {
|
||
|
result = "string:";
|
||
|
} else {
|
||
|
char n[20];
|
||
|
sprintf(n, "%d:", index);
|
||
|
result = "array:";
|
||
|
result += n;
|
||
|
}
|
||
|
result += id;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
split(const string& raw, vector<string>*parts)
|
||
|
{
|
||
|
size_t index = 0;
|
||
|
while (true) {
|
||
|
size_t next = raw.find(':', index);
|
||
|
if (next != raw.npos) {
|
||
|
parts->push_back(string(raw, index, next-index));
|
||
|
index = next + 1;
|
||
|
} else {
|
||
|
parts->push_back(string(raw, index));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
StringResource::ParseTypedID(const string& raw, string* id, int* index)
|
||
|
{
|
||
|
vector<string> parts;
|
||
|
split(raw, &parts);
|
||
|
|
||
|
const size_t N = parts.size();
|
||
|
|
||
|
for (size_t i=0; i<N; i++) {
|
||
|
if (parts[i].length() == 0) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (N == 2 && parts[0] == "string") {
|
||
|
*id = parts[1];
|
||
|
*index = -1;
|
||
|
return true;
|
||
|
}
|
||
|
else if (N == 3 && parts[0] == "array") {
|
||
|
char* p;
|
||
|
int n = (int)strtol(parts[1].c_str(), &p, 0);
|
||
|
if (*p == '\0') {
|
||
|
*id = parts[2];
|
||
|
*index = n;
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|