#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;
}
}