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