• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Values.h"
2 #include <stdlib.h>
3 #include <cstdio>
4 
5 
6 // =====================================================================================
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)7 StringResource::StringResource(const SourcePos& p, const string& f, const Configuration& c,
8                     const string& i, int ix, XMLNode* v, const int ve, const string& vs,
9                     const string& cmnt)
10     :pos(p),
11      file(f),
12      config(c),
13      id(i),
14      index(ix),
15      value(v),
16      version(ve),
17      versionString(vs),
18      comment(cmnt)
19 {
20 }
21 
StringResource()22 StringResource::StringResource()
23     :pos(),
24      file(),
25      config(),
26      id(),
27      index(-1),
28      value(NULL),
29      version(),
30      versionString(),
31      comment()
32 {
33 }
34 
StringResource(const StringResource & that)35 StringResource::StringResource(const StringResource& that)
36     :pos(that.pos),
37      file(that.file),
38      config(that.config),
39      id(that.id),
40      index(that.index),
41      value(that.value),
42      version(that.version),
43      versionString(that.versionString),
44      comment(that.comment)
45 {
46 }
47 
48 int
Compare(const StringResource & that) const49 StringResource::Compare(const StringResource& that) const
50 {
51     if (file != that.file) {
52         return file < that.file ? -1 : 1;
53     }
54     if (id != that.id) {
55         return id < that.id ? -1 : 1;
56     }
57     if (index != that.index) {
58         return index - that.index;
59     }
60     if (config != that.config) {
61         return config < that.config ? -1 : 1;
62     }
63     if (version != that.version) {
64         return version < that.version ? -1 : 1;
65     }
66     return 0;
67 }
68 
69 string
TypedID() const70 StringResource::TypedID() const
71 {
72     string result;
73     if (index < 0) {
74         result = "string:";
75     } else {
76         char n[20];
77         sprintf(n, "%d:", index);
78         result = "array:";
79         result += n;
80     }
81     result += id;
82     return result;
83 }
84 
85 static void
split(const string & raw,vector<string> * parts)86 split(const string& raw, vector<string>*parts)
87 {
88     size_t index = 0;
89     while (true) {
90         size_t next = raw.find(':', index);
91         if (next != raw.npos) {
92             parts->push_back(string(raw, index, next-index));
93             index = next + 1;
94         } else {
95             parts->push_back(string(raw, index));
96             break;
97         }
98     }
99 }
100 
101 bool
ParseTypedID(const string & raw,string * id,int * index)102 StringResource::ParseTypedID(const string& raw, string* id, int* index)
103 {
104     vector<string> parts;
105     split(raw, &parts);
106 
107     const size_t N = parts.size();
108 
109     for (size_t i=0; i<N; i++) {
110         if (parts[i].length() == 0) {
111             return false;
112         }
113     }
114 
115     if (N == 2 && parts[0] == "string") {
116         *id = parts[1];
117         *index = -1;
118         return true;
119     }
120     else if (N == 3 && parts[0] == "array") {
121         char* p;
122         int n = (int)strtol(parts[1].c_str(), &p, 0);
123         if (*p == '\0') {
124             *id = parts[2];
125             *index = n;
126             return true;
127         } else {
128             return false;
129         }
130     }
131     else {
132         return false;
133     }
134 }
135 
136