154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Values.h" 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdlib.h> 38a2b9083e364ffd46f56362d46af2aeb4718d325Scott Tsai#include <cstdio> 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project// ===================================================================================== 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStringResource::StringResource(const SourcePos& p, const string& f, const Configuration& c, 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& i, int ix, XMLNode* v, const int ve, const string& vs, 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& cmnt) 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project :pos(p), 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project file(f), 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project config(c), 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project id(i), 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index(ix), 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project value(v), 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project version(ve), 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project versionString(vs), 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project comment(cmnt) 1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStringResource::StringResource() 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project :pos(), 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project file(), 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project config(), 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project id(), 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index(-1), 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project value(NULL), 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project version(), 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project versionString(), 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project comment() 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStringResource::StringResource(const StringResource& that) 3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project :pos(that.pos), 3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project file(that.file), 3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project config(that.config), 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project id(that.id), 4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index(that.index), 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project value(that.value), 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project version(that.version), 4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project versionString(that.versionString), 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project comment(that.comment) 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStringResource::Compare(const StringResource& that) const 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (file != that.file) { 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return file < that.file ? -1 : 1; 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (id != that.id) { 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return id < that.id ? -1 : 1; 5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (index != that.index) { 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return index - that.index; 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (config != that.config) { 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return config < that.config ? -1 : 1; 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (version != that.version) { 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return version < that.version ? -1 : 1; 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstring 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStringResource::TypedID() const 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string result; 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (index < 0) { 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result = "string:"; 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char n[20]; 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project sprintf(n, "%d:", index); 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result = "array:"; 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result += n; 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project result += id; 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return result; 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectsplit(const string& raw, vector<string>*parts) 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t index = 0; 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (true) { 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t next = raw.find(':', index); 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (next != raw.npos) { 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project parts->push_back(string(raw, index, next-index)); 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index = next + 1; 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project parts->push_back(string(raw, index)); 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectStringResource::ParseTypedID(const string& raw, string* id, int* index) 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> parts; 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project split(raw, &parts); 10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t N = parts.size(); 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<N; i++) { 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (parts[i].length() == 0) { 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (N == 2 && parts[0] == "string") { 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *id = parts[1]; 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *index = -1; 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (N == 3 && parts[0] == "array") { 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project char* p; 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int n = (int)strtol(parts[1].c_str(), &p, 0); 12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (*p == '\0') { 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *id = parts[2]; 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *index = n; 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 136