summaryrefslogtreecommitdiffstats
path: root/tools/localize/Values.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/localize/Values.cpp')
-rw-r--r--tools/localize/Values.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/tools/localize/Values.cpp b/tools/localize/Values.cpp
new file mode 100644
index 0000000..e396f8b
--- /dev/null
+++ b/tools/localize/Values.cpp
@@ -0,0 +1,134 @@
+#include "Values.h"
+#include <stdlib.h>
+
+
+// =====================================================================================
+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;
+ }
+}
+