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