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