Perforce.cpp revision bdb087c9305d6d753444e1c0176a793c00f07840
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Perforce.h"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "log.h"
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
4bdb087c9305d6d753444e1c0176a793c00f07840Jack Palevich#include <cstdio>
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sstream>
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/wait.h>
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace std;
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern char** environ;
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::RunCommand(const string& cmd, string* result, bool printOnFailure)
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int outPipe[2];
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int errPipe[2];
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pid_t pid;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    log_printf("Perforce::RunCommand: %s\n", cmd.c_str());
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = pipe(outPipe);
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err |= pipe(errPipe);
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err == -1) {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        printf("couldn't create pipe. exiting.\n");
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        exit(1);
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pid = fork();
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pid == -1) {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        printf("couldn't fork. eixiting\n");
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        exit(1);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (pid == 0) {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char const* args[] = {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "/bin/sh",
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "-c",
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cmd.c_str(),
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NULL
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(outPipe[0]);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(errPipe[0]);
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dup2(outPipe[1], 1);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dup2(errPipe[1], 2);
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        execve(args[0], (char* const*)args, environ);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // done
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    close(outPipe[1]);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    close(errPipe[1]);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result->clear();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char buf[1024];
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // stdout
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (true) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t amt = read(outPipe[0], buf, sizeof(buf));
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result->append(buf, amt);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (amt <= 0) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // stderr -- the messages are short so it ought to just fit in the buffer
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string error;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (true) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t amt = read(errPipe[0], buf, sizeof(buf));
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        error.append(buf, amt);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (amt <= 0) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    close(outPipe[0]);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    close(errPipe[0]);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    waitpid(pid, &err, 0);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (WIFEXITED(err)) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = WEXITSTATUS(err);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = -1;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != 0 && printOnFailure) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        write(2, error.c_str(), error.length());
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::GetResourceFileNames(const string& version, const string& base,
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const vector<string>& apps, vector<string>* results,
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                bool printOnFailure)
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string text;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    stringstream cmd;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    cmd << "p4 files";
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t I = apps.size();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<I; i++) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cmd << " \"" << base << '/' << apps[i] << "/res/values/strings.xml@" << version << '"';
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = RunCommand(cmd.str(), &text, printOnFailure);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* str = text.c_str();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (*str) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const char* lineend = strchr(str, '\n');
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lineend == str) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str++;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            continue;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lineend-str > 1023) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fprintf(stderr, "line too long!\n");
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 1;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        string s(str, lineend-str);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char filename[1024];
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char edit[1024];
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = sscanf(str, "%[^#]#%*d - %s change %*d %*[^\n]\n", filename, edit);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count == 2 && 0 != strcmp("delete", edit)) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results->push_back(string(filename));
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = lineend + 1;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::GetFile(const string& file, const string& version, string* result,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool printOnFailure)
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    stringstream cmd;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    cmd << "p4 print -q \"" << file << '@' << version << '"';
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return RunCommand(cmd.str(), result, printOnFailure);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstring
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::GetCurrentChange(bool printOnFailure)
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string text;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = RunCommand("p4 changes -m 1 \\#have", &text, printOnFailure);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != 0) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "";
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long long n;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int count = sscanf(text.c_str(), "Change %lld on", &n);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (count != 1) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "";
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char result[100];
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sprintf(result, "%lld", n);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return string(result);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectdo_files(const string& op, const vector<string>& files, bool printOnFailure)
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string text;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    stringstream cmd;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    cmd << "p4 " << op;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t I = files.size();
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<I; i++) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cmd << " \"" << files[i] << "\"";
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return Perforce::RunCommand(cmd.str(), &text, printOnFailure);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::EditFiles(const vector<string>& files, bool printOnFailure)
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return do_files("edit", files, printOnFailure);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::AddFiles(const vector<string>& files, bool printOnFailure)
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return do_files("add", files, printOnFailure);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::DeleteFiles(const vector<string>& files, bool printOnFailure)
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return do_files("delete", files, printOnFailure);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstring
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectPerforce::Where(const string& depotPath, bool printOnFailure)
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int err;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string text;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string cmd = "p4 where ";
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    cmd += depotPath;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = RunCommand(cmd, &text, printOnFailure);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != 0) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "";
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t index = text.find(' ');
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index == text.npos) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "";
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    index = text.find(' ', index+1)+1;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index == text.npos) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "";
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return text.substr(index, text.length()-index-1);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
232