text: /*
   * 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();
  }
  