blob: d465405440ea27d35d3a62244cd4638607da7125 [file] [log] [blame]
/*
* Copyright (c) 2018, Google Inc.
* All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "perf_to_profile_lib.h"
#include <sys/stat.h>
#include <sstream>
bool FileExists(const string& path) {
struct stat file_stat;
return stat(path.c_str(), &file_stat) != -1;
}
string ReadFileToString(const string& path) {
std::ifstream perf_file(path);
if (!perf_file.is_open()) {
LOG(FATAL) << "Failed to open file: " << path;
}
std::ostringstream ss;
ss << perf_file.rdbuf();
return ss.str();
}
void CreateFile(const string& path, std::ofstream* file, bool overwriteOutput) {
if (!overwriteOutput && FileExists(path)) {
LOG(FATAL) << "File already exists: " << path;
}
file->open(path, std::ios_base::trunc);
if (!file->is_open()) {
LOG(FATAL) << "Failed to open file: " << path;
}
}
void PrintUsage() {
LOG(INFO) << "Usage:";
LOG(INFO) << "perf_to_profile -i <input perf data> -o <output profile> [-f]";
LOG(INFO) << "If the -f option is given, overwrite the existing output "
<< "profile.";
}
bool ParseArguments(int argc, const char* argv[], string* input, string* output,
bool* overwriteOutput) {
*input = "";
*output = "";
*overwriteOutput = false;
int opt;
while ((opt = getopt(argc, const_cast<char* const*>(argv), ":fi:o:")) != -1) {
switch (opt) {
case 'i':
*input = optarg;
break;
case 'o':
*output = optarg;
break;
case 'f':
*overwriteOutput = true;
break;
case ':':
LOG(ERROR) << "Must provide arguments for flags -i and -o";
return false;
case '?':
LOG(ERROR) << "Invalid option: " << static_cast<char>(optopt);
return false;
default:
LOG(ERROR) << "Invalid option: " << static_cast<char>(opt);
return false;
}
}
return !input->empty() && !output->empty();
}