154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "SourcePos.h"
254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "ValuesFile.h"
354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "XLIFFFile.h"
454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Perforce.h"
554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "merge_res_and_xliff.h"
654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "localize.h"
754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "file_utils.h"
854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "res_check.h"
954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "xmb.h"
1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <host/pseudolocalize.h>
1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
13b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project#include <stdlib.h>
1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdarg.h>
1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sstream>
1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdio.h>
1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <string.h>
18862bfdba159580f825af563b8e283842e28d140cAlexey Zaytsev#include <stdlib.h>
1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectusing namespace std;
2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectFILE* g_logFile = NULL;
2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint test();
2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectread_settings(const string& filename, map<string,Settings>* result, const string& rootDir)
2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    XMLNode* root = NodeHandler::ParseFile(filename, XMLNode::PRETTY);
3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (root == NULL) {
3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        SourcePos(filename, -1).Error("Error reading file.");
3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 1;
3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // <configuration>
3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    vector<XMLNode*> configNodes = root->GetElementsByName("", "configuration");
3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t I = configNodes.size();
3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0; i<I; i++) {
3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const XMLNode* configNode = configNodes[i];
4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Settings settings;
4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        settings.id = configNode->GetAttribute("", "id", "");
4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (settings.id == "") {
4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            configNode->Position().Error("<configuration> needs an id attribute.");
4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            delete root;
4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return 1;
4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        settings.oldVersion = configNode->GetAttribute("", "old-cl", "");
5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        settings.currentVersion = configNode->GetAttribute("", "new-cl", "");
5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (settings.currentVersion == "") {
5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            configNode->Position().Error("<configuration> needs a new-cl attribute.");
5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            delete root;
5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return 1;
5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // <app>
5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<XMLNode*> appNodes = configNode->GetElementsByName("", "app");
6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t J = appNodes.size();
6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t j=0; j<J; j++) {
6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const XMLNode* appNode = appNodes[j];
6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            string dir = appNode->GetAttribute("", "dir", "");
6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (dir == "") {
6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                appNode->Position().Error("<app> needs a dir attribute.");
6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                delete root;
6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return 1;
7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            settings.apps.push_back(dir);
7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // <reject>
7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<XMLNode*> rejectNodes = configNode->GetElementsByName("", "reject");
7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t K = rejectNodes.size();
7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t k=0; k<K; k++) {
8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const XMLNode* rejectNode = rejectNodes[k];
8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            Reject reject;
8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            reject.file = rejectNode->GetAttribute("", "file", "");
8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (reject.file == "") {
8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                rejectNode->Position().Error("<reject> needs a file attribute.");
8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                delete root;
8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return 1;
8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            string f =  reject.file;
9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            reject.file = rootDir;
9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            reject.file += '/';
9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            reject.file += f;
9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            reject.name = rejectNode->GetAttribute("", "name", "");
9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (reject.name == "") {
9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                rejectNode->Position().Error("<reject> needs a name attribute.");
9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                delete root;
9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return 1;
10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            reject.comment = trim_string(rejectNode->CollapseTextContents());
10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            settings.reject.push_back(reject);
10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        (*result)[settings.id] = settings;
10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    delete root;
11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void
11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectValuesFile_to_XLIFFFile(const ValuesFile* values, XLIFFFile* xliff, const string& englishFilename)
11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const set<StringResource>& strings = values->GetStrings();
11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (set<StringResource>::const_iterator it=strings.begin(); it!=strings.end(); it++) {
12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        StringResource res = *it;
12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        res.file = englishFilename;
12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        xliff->AddStringResource(res);
12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic bool
12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectcontains_reject(const Settings& settings, const string& file, const TransUnit& tu)
12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const string name = tu.id;
13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const vector<Reject>& reject = settings.reject;
13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const size_t I = reject.size();
13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0; i<I; i++) {
13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Reject& r = reject[i];
13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (r.file == file && r.name == name) {
13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return true;
13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return false;
13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/**
14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * If it's been rejected, then we keep whatever info we have.
14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Implements this truth table:
14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    S   AT   AS     Keep
14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *   -----------------------
14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    0    0    0      0    (this case can't happen)
14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    0    0    1      0    (it was there, never translated, and removed)
15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    0    1    0      0    (somehow it got translated, but it was removed)
15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    0    1    1      0    (it was removed after having been translated)
15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    1    0    0      1    (it was just added)
15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    1    0    1      1    (it was added, has been changed, but it never got translated)
15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    1    1    0      1    (somehow it got translated, but we don't know based on what)
15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *    1    1    1     0/1   (it's in both.  0 if S=AS b/c there's no need to retranslate if they're
15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *                           the same.  1 if S!=AS because S changed, so it should be retranslated)
15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The first four are cases where, whatever happened in the past, the string isn't there
16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * now, so it shouldn't be in the XLIFF file.
16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For cases 4 and 5, the string has never been translated, so get it translated.
16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For case 6, it's unclear where the translated version came from, so we're conservative
16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and send it back for them to have another shot at.
16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *
16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For case 7, we have some data.  We have two choices.  We could rely on the translator's
16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * translation memory or tools to notice that the strings haven't changed, and populate the
16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <target> field themselves.  Or if the string hasn't changed since last time, we can just
17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * not even tell them about it.  As the project nears the end, it will be convenient to see
17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the xliff files reducing in size, so we pick the latter.  Obviously, if the string has
17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * changed, then we need to get it retranslated.
17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */
17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool
17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectkeep_this_trans_unit(const string& file, const TransUnit& unit, void* cookie)
17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const Settings* settings = reinterpret_cast<const Settings*>(cookie);
17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (contains_reject(*settings, file, unit)) {
18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return true;
18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (unit.source.id == "") {
18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return false;
18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (unit.altTarget.id == "" || unit.altSource.id == "") {
18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return true;
18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return unit.source.value->ContentsToString(XLIFF_NAMESPACES)
19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            != unit.altSource.value->ContentsToString(XLIFF_NAMESPACES);
19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvalidate_config(const string& settingsFile, const map<string,Settings>& settings,
19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const string& config)
19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (settings.find(config) == settings.end()) {
19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        SourcePos(settingsFile, -1).Error("settings file does not contain setting: %s\n",
19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                config.c_str());
20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 1;
20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvalidate_configs(const string& settingsFile, const map<string,Settings>& settings,
20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const vector<string>& configs)
20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int err = 0;
21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0; i<configs.size(); i++) {
21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string config = configs[i];
21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        err |= validate_config(settingsFile, settings, config);
21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return err;
21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectselect_files(vector<string> *resFiles, const string& config,
21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const map<string,Settings>& settings, const string& rootDir)
22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int err;
22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    vector<vector<string> > allResFiles;
22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    vector<string> configs;
22454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    configs.push_back(config);
22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    err = select_files(&allResFiles, configs, settings, rootDir);
22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err == 0) {
22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        *resFiles = allResFiles[0];
22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return err;
23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
23154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
23254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
23354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectselect_files(vector<vector<string> > *allResFiles, const vector<string>& configs,
23454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const map<string,Settings>& settings, const string& rootDir)
23554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
23654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int err;
23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    printf("Selecting files...");
23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    fflush(stdout);
23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0; i<configs.size(); i++) {
24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const string& config = configs[i];
24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Settings& setting = settings.find(config)->second;
24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<string> resFiles;
24554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        err = Perforce::GetResourceFileNames(setting.currentVersion, rootDir,
24654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                                setting.apps, &resFiles, true);
24754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (err != 0) {
24854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "error with perforce.  bailing\n");
24954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return err;
25054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        allResFiles->push_back(resFiles);
25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
25654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
25754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic int
25854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectdo_export(const string& settingsFile, const string& rootDir, const string& outDir,
25954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            const string& targetLocale, const vector<string>& configs)
26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    bool success = true;
26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int err;
26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (false) {
26554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        printf("settingsFile=%s\n", settingsFile.c_str());
26654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        printf("rootDir=%s\n", rootDir.c_str());
26754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        printf("outDir=%s\n", outDir.c_str());
26854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0; i<configs.size(); i++) {
26954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            printf("config[%zd]=%s\n", i, configs[i].c_str());
27054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
27254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    map<string,Settings> settings;
27454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    err = read_settings(settingsFile, &settings, rootDir);
27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err != 0) {
27654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return err;
27754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
27854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
27954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    err = validate_configs(settingsFile, settings, configs);
28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err != 0) {
28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return err;
28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
28454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    vector<vector<string> > allResFiles;
28554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    err = select_files(&allResFiles, configs, settings, rootDir);
28654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (err != 0) {
28754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return err;
28854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
28954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
29054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t totalFileCount = 0;
29154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0; i<allResFiles.size(); i++) {
29254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totalFileCount += allResFiles[i].size();
29354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
29454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    totalFileCount *= 3; // we try all 3 versions of the file
29554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
29654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    size_t fileProgress = 0;
29754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    vector<Stats> stats;
29854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    vector<pair<string,XLIFFFile*> > xliffs;
29954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
30054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (size_t i=0; i<configs.size(); i++) {
30154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const string& config = configs[i];
30254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const Settings& setting = settings[config];
30354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
30454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (false) {
30554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "Configuration: %s (%zd of %zd)\n", config.c_str(), i+1,
30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    configs.size());
30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "  Old CL:     %s\n", setting.oldVersion.c_str());
30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "  Current CL: %s\n", setting.currentVersion.c_str());
30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
31154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Configuration english;
31254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            english.locale = "en_US";
31354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Configuration translated;
31454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            translated.locale = targetLocale;
31554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        XLIFFFile* xliff = XLIFFFile::Create(english, translated, setting.currentVersion);
31654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const vector<string>& resFiles = allResFiles[i];
31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t J = resFiles.size();
31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t j=0; j<J; j++) {
32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            string resFile = resFiles[j];
32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // parse the files into a ValuesFile
32354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // pull out the strings and add them to the XLIFFFile
32454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
32554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // current file
32654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            print_file_status(++fileProgress, totalFileCount);
32754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            ValuesFile* currentFile = get_values_file(resFile, english, CURRENT_VERSION,
32854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                                        setting.currentVersion, true);
32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (currentFile != NULL) {
33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                ValuesFile_to_XLIFFFile(currentFile, xliff, resFile);
33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                //printf("currentFile=[%s]\n", currentFile->ToString().c_str());
33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            } else {
33354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                fprintf(stderr, "error reading file %s@%s\n", resFile.c_str(),
33454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                            setting.currentVersion.c_str());
33554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                success = false;
33654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
33754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
33854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // old file
33954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            print_file_status(++fileProgress, totalFileCount);
34054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            ValuesFile* oldFile = get_values_file(resFile, english, OLD_VERSION,
34154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                                        setting.oldVersion, false);
34254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (oldFile != NULL) {
34354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                ValuesFile_to_XLIFFFile(oldFile, xliff, resFile);
34454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                //printf("oldFile=[%s]\n", oldFile->ToString().c_str());
34554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
34654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
34754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // translated version
34854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // (get the head of the tree for the most recent translation, but it's considered
34954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // the old one because the "current" one hasn't been made yet, and this goes into
35054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // the <alt-trans> tag if necessary
35154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            print_file_status(++fileProgress, totalFileCount);
35254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            string transFilename = translated_file_name(resFile, targetLocale);
35354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            ValuesFile* transFile = get_values_file(transFilename, translated, OLD_VERSION,
35454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                                        setting.currentVersion, false);
35554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (transFile != NULL) {
35654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                ValuesFile_to_XLIFFFile(transFile, xliff, resFile);
35754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
35854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
35954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            delete currentFile;
36054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            delete oldFile;
36154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            delete transFile;
36254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
36354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
36454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Stats beforeFilterStats = xliff->GetStats(config);
36554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
36654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // run through the XLIFFFile and strip out TransUnits that have identical
36754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // old and current source values and are not in the reject list, or just
36854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // old values and no source values
36954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        xliff->Filter(keep_this_trans_unit, (void*)&setting);
37054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
37154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        Stats afterFilterStats = xliff->GetStats(config);
37254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        afterFilterStats.totalStrings = beforeFilterStats.totalStrings;
37354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
37454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // add the reject comments
37554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (vector<Reject>::const_iterator reject = setting.reject.begin();
37654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                reject != setting.reject.end(); reject++) {
37754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            TransUnit* tu = xliff->EditTransUnit(reject->file, reject->name);
37854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            tu->rejectComment = reject->comment;
37954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
38054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
38154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        // config-locale-current_cl.xliff
38254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stringstream filename;
38354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (outDir != "") {
38454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            filename << outDir << '/';
38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        filename << config << '-' << targetLocale << '-' << setting.currentVersion << ".xliff";
38754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        xliffs.push_back(pair<string,XLIFFFile*>(filename.str(), xliff));
38854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
38954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        stats.push_back(afterFilterStats);
39054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
39154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
39254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // today is a good day to die
39354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (!success || SourcePos::HasErrors()) {
39454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 1;
39554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // write the XLIFF files
39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    printf("\nWriting %zd file%s...\n", xliffs.size(), xliffs.size() == 1 ? "" : "s");
39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (vector<pair<string,XLIFFFile*> >::iterator it = xliffs.begin(); it != xliffs.end(); it++) {
40054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const string& filename = it->first;
40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        XLIFFFile* xliff = it->second;
40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string text = xliff->ToString();
40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        write_to_file(filename, text);
40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
40554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
40654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    // the stats
40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    printf("\n"
40854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project           "                                  to          without     total\n"
40954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project           " config               files       translate   comments    strings\n"
41054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project           "-----------------------------------------------------------------------\n");
41154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    Stats totals;
41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.config = "total";
41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.files = 0;
41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.toBeTranslated = 0;
41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.noComments = 0;
41654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.totalStrings = 0;
41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    for (vector<Stats>::iterator it=stats.begin(); it!=stats.end(); it++) {
41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string cfg = it->config;
41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (cfg.length() > 20) {
42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            cfg.resize(20);
42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
42254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        printf(" %-20s  %-9zd   %-9zd   %-9zd   %-19zd\n", cfg.c_str(), it->files,
42354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                it->toBeTranslated, it->noComments, it->totalStrings);
42454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.files += it->files;
42554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.toBeTranslated += it->toBeTranslated;
42654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.noComments += it->noComments;
42754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        totals.totalStrings += it->totalStrings;
42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (stats.size() > 1) {
43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        printf("-----------------------------------------------------------------------\n"
43154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project               " %-20s  %-9zd   %-9zd   %-9zd   %-19zd\n", totals.config.c_str(), totals.files,
43254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                    totals.toBeTranslated, totals.noComments, totals.totalStrings);
43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    printf("\n");
43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
43754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstruct PseudolocalizeSettings {
43954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    XLIFFFile* xliff;
44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    bool expand;
44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project};
44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstring
44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_string(const string& source, const PseudolocalizeSettings* settings)
44654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return pseudolocalize_string(source);
44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
45054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic XMLNode*
45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_xml_node(const XMLNode* source, const PseudolocalizeSettings* settings)
45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (source->Type() == XMLNode::TEXT) {
45454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return XMLNode::NewText(source->Position(), pseudolocalize_string(source->Text(), settings),
45554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                source->Pretty());
45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    } else {
45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        XMLNode* target;
45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (source->Namespace() == XLIFF_XMLNS && source->Name() == "g") {
45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            // XXX don't translate these
46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            target = XMLNode::NewElement(source->Position(), source->Namespace(),
46154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                    source->Name(), source->Attributes(), source->Pretty());
46254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        } else {
46354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            target = XMLNode::NewElement(source->Position(), source->Namespace(),
46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                                    source->Name(), source->Attributes(), source->Pretty());
46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const vector<XMLNode*>& children = source->Children();
46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        const size_t I = children.size();
46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (size_t i=0; i<I; i++) {
47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            target->EditChildren().push_back(pseudolocalize_xml_node(children[i], settings));
47154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
47254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return target;
47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
47654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
47754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid
47854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_trans_unit(const string&file, TransUnit* unit, void* cookie)
47954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
48054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const PseudolocalizeSettings* settings = (PseudolocalizeSettings*)cookie;
48154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
48254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    const StringResource& source = unit->source;
48354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    StringResource* target = &unit->target;
48454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    *target = source;
48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    target->config = settings->xliff->TargetConfig();
48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    delete target->value;
48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    target->value = pseudolocalize_xml_node(source.value, settings);
49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
49154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_xliff(XLIFFFile* xliff, bool expand)
49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
49554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    PseudolocalizeSettings settings;
49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    settings.xliff = xliff;
49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    settings.expand = expand;
49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    xliff->Map(pseudolocalize_trans_unit, &settings);
50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic int
50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectdo_pseudo(const string& infile, const string& outfile, bool expand)
50554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
50654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int err;
50754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    XLIFFFile* xliff = XLIFFFile::Parse(infile);
50954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (xliff == NULL) {
51054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 1;
51154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
51254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
51354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    pseudolocalize_xliff(xliff, expand);
51454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
51554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    err = write_to_file(outfile, xliff->ToString());
51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
51754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    delete xliff;
51854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
51954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return err;
52054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
52154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
52254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid
52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectlog_printf(const char *fmt, ...)
52454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
52554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int ret;
52654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    va_list ap;
52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
52854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (g_logFile != NULL) {
52954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        va_start(ap, fmt);
53054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        ret = vfprintf(g_logFile, fmt, ap);
53154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        va_end(ap);
53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        fflush(g_logFile);
53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid
53754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectclose_log_file()
53854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
53954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (g_logFile != NULL) {
54054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        fclose(g_logFile);
54154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
54254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
54354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
54454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid
54554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectopen_log_file(const char* file)
54654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
54754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    g_logFile = fopen(file, "w");
54854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    printf("log file: %s -- %p\n", file, g_logFile);
54954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    atexit(close_log_file);
55054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
55154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic int
55354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectusage()
55454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
55554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    fprintf(stderr,
55654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "usage: localize export OPTIONS CONFIGS...\n"
55754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "   REQUIRED OPTIONS\n"
55854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "     --settings SETTINGS   The settings file to use.  See CONFIGS below.\n"
55954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "     --root TREE_ROOT      The location in Perforce of the files.  e.g. //device\n"
56054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "     --target LOCALE       The target locale.  See LOCALES below.\n"
56154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
56254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "   OPTIONAL OPTIONS\n"
56354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "      --out DIR            Directory to put the output files.  Defaults to the\n"
56454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "                           current directory if not supplied.  Files are\n"
56554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "                           named as follows:\n"
56654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "                               CONFIG-LOCALE-CURRENT_CL.xliff\n"
56754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
56854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
56954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "usage: localize import XLIFF_FILE...\n"
57054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
57154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Import a translated XLIFF file back into the tree.\n"
57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
57454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "usage: localize xlb XMB_FILE VALUES_FILES...\n"
57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Read resource files from the tree file and write the corresponding XLB file\n"
57754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
57854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Supply all of the android resource files (values files) to export after that.\n"
57954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
58054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
58154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "CONFIGS\n"
58354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "LOCALES\n"
58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Locales are specified in the form en_US  They will be processed correctly\n"
58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "to locate the resouce files in the tree.\n"
58754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
58954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "usage: localize pseudo OPTIONS INFILE [OUTFILE]\n"
59054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "   OPTIONAL OPTIONS\n"
59154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "     --big                 Pad strings so they get longer.\n"
59254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
59354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Read INFILE, an XLIFF file, and output a pseudotranslated version of that file.  If\n"
59454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "OUTFILE is specified, the results are written there; otherwise, the results are\n"
59554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "written back to INFILE.\n"
59654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
59754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
59854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "usage: localize rescheck FILES...\n"
59954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n"
60054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "Reads the base strings and prints warnings about bad resources from the given files.\n"
60154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            "\n");
60254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 1;
60354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
60454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
60554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint
60654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectmain(int argc, const char** argv)
60754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{
60854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    //open_log_file("log.txt");
60954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    //g_logFile = stdout;
61054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
61154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (argc == 2 && 0 == strcmp(argv[1], "--test")) {
61254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return test();
61354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
61454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
61554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (argc < 2) {
61654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return usage();
61754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
61854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
61954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    int index = 1;
62054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
62154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (0 == strcmp("export", argv[index])) {
62254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string settingsFile;
62354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string rootDir;
62454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string outDir;
62554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string baseLocale = "en";
62654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string targetLocale;
62754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string language, region;
62854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<string> configs;
62954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
63054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        index++;
63154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        while (index < argc) {
63254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (0 == strcmp("--settings", argv[index])) {
63354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                settingsFile = argv[index+1];
63454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                index += 2;
63554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
63654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else if (0 == strcmp("--root", argv[index])) {
63754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                rootDir = argv[index+1];
63854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                index += 2;
63954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
64054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else if (0 == strcmp("--out", argv[index])) {
64154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                outDir = argv[index+1];
64254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                index += 2;
64354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
64454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else if (0 == strcmp("--target", argv[index])) {
64554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                targetLocale = argv[index+1];
64654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                index += 2;
64754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
64854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else if (argv[index][0] == '-') {
64954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                fprintf(stderr, "unknown argument %s\n", argv[index]);
65054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return usage();
65154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
65254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else {
65354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                break;
65454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
65554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
65654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (; index<argc; index++) {
65754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            configs.push_back(argv[index]);
65854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
65954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
66054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (settingsFile == "" || rootDir == "" || configs.size() == 0 || targetLocale == "") {
66154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return usage();
66254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
66354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (!split_locale(targetLocale, &language, &region)) {
66454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "illegal --target locale: '%s'\n", targetLocale.c_str());
66554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return usage();
66654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
66754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
66854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
66954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return do_export(settingsFile, rootDir, outDir, targetLocale, configs);
67054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
67154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    else if (0 == strcmp("import", argv[index])) {
67254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<string> xliffFilenames;
67354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
67454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        index++;
67554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (; index<argc; index++) {
67654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            xliffFilenames.push_back(argv[index]);
67754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
67854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
67954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return do_merge(xliffFilenames);
68054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
68154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    else if (0 == strcmp("xlb", argv[index])) {
68254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string outfile;
68354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<string> resFiles;
68454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
68554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        index++;
68654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (argc < index+1) {
68754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return usage();
68854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
68954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
69054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        outfile = argv[index];
69154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
69254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        index++;
69354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (; index<argc; index++) {
69454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            resFiles.push_back(argv[index]);
69554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
69654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
69754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return do_xlb_export(outfile, resFiles);
69854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
69954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    else if (0 == strcmp("pseudo", argv[index])) {
70054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string infile;
70154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        string outfile;
70254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        bool big = false;
70354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
70454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        index++;
70554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        while (index < argc) {
70654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (0 == strcmp("--big", argv[index])) {
70754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                big = true;
70854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                index += 1;
70954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
71054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else if (argv[index][0] == '-') {
71154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                fprintf(stderr, "unknown argument %s\n", argv[index]);
71254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return usage();
71354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
71454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else {
71554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                break;
71654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
71954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (index == argc-1) {
72054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            infile = argv[index];
72154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            outfile = argv[index];
72254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
72354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        else if (index == argc-2) {
72454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            infile = argv[index];
72554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            outfile = argv[index+1];
72654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        else {
72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            fprintf(stderr, "unknown argument %s\n", argv[index]);
72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return usage();
73054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
73154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
73254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return do_pseudo(infile, outfile, big);
73354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
73454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    else if (0 == strcmp("rescheck", argv[index])) {
73554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        vector<string> files;
73654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
73754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        index++;
73854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        while (index < argc) {
73954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            if (argv[index][0] == '-') {
74054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                fprintf(stderr, "unknown argument %s\n", argv[index]);
74154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                return usage();
74254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
74354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            else {
74454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project                break;
74554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            }
74654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
74754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        for (; index<argc; index++) {
74854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            files.push_back(argv[index]);
74954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
75054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
75154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        if (files.size() == 0) {
75254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project            return usage();
75354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        }
75454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
75554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return do_rescheck(files);
75654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
75754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    else {
75854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return usage();
75954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
76054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
76154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    if (SourcePos::HasErrors()) {
76254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        SourcePos::PrintErrors(stderr);
76354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project        return 1;
76454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    }
76554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
76654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project    return 0;
76754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}
76854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project
769