// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <vector>
#include "base/logging.h"
#include "compat/log_level.h"
#include "compat/string.h"
#include "conversion_utils.h"
using quipper::FormatAndFile;
using quipper::kPerfFormat;
using quipper::kProtoTextFormat;
namespace {
// Default output format of this tool is proto text format.
const char kDefaultOutputFormat[] = "text";
// Default output filename is simply stdout.
const char kDefaultOutputFilename[] = "/dev/stdout";
// Default input filename is perf.data in cwd.
const char kDefaultInputFilename[] = "perf.data";
// Default input format is perf.data format.
const char kDefaultInputFormat[] = "perf";
// Parses arguments, storing the results in |input| and |output|. Returns true
// if arguments parsed successfully and false otherwise.
bool ParseArguments(int argc, char* argv[], FormatAndFile* input,
FormatAndFile* output) {
output->filename = kDefaultOutputFilename;
output->format = kDefaultOutputFormat;
input->filename = kDefaultInputFilename;
input->format = kDefaultInputFormat;
int opt;
while ((opt = getopt(argc, argv, "i:o:I:O:v:")) != -1) {
switch (opt) {
case 'i': {
input->filename = optarg;
break;
}
case 'I': {
input->format = optarg;
break;
}
case 'o': {
output->filename = optarg;
break;
}
case 'O': {
output->format = optarg;
break;
}
case 'v': {
quipper::SetVerbosityLevel(atoi(optarg));
break;
}
default:
return false;
}
}
return true;
}
void PrintUsage() {
LOG(INFO) << "Usage:";
LOG(INFO) << "<exe> -i <input filename> -I <input format>"
<< " -o <output filename> -O <output format> -v <verbosity level>";
LOG(INFO) << "Format options are: '" << kPerfFormat << "' for perf.data"
<< " and '" << kProtoTextFormat << "' for proto text.";
LOG(INFO) << "By default it reads from perf.data and outputs to /dev/stdout"
<< " in proto text format.";
LOG(INFO) << "Default verbosity level is 0. Higher values increase verbosity."
<< " Negative values filter LOG() levels.";
}
} // namespace
int main(int argc, char* argv[]) {
FormatAndFile input, output;
if (!ParseArguments(argc, argv, &input, &output)) {
PrintUsage();
return EXIT_FAILURE;
}
if (!quipper::ConvertFile(input, output)) return EXIT_FAILURE;
return EXIT_SUCCESS;
}