Home | History | Annotate | Download | only in localize
      1 #include "Values.h"
      2 #include <stdlib.h>
      3 #include <cstdio>
      4 
      5 
      6 // =====================================================================================
      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 
     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 
     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
     49 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
     70 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
     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
    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