blob: add9fb720ad1db0d4fabf999ee2f1519f50c7f2b [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#ifndef RR_COMMAND_H_
#define RR_COMMAND_H_
#ifndef _DEFAULT_SOURCE
#define _DEFAULT_SOURCE 1
#endif
#include <stdint.h>
#include <stdio.h>
#include <memory>
#include <string>
#include <vector>
namespace rr {
class TraceReader;
enum OptionParameters { NO_PARAMETER, HAS_PARAMETER };
struct OptionSpec {
char short_name;
const char* long_name;
OptionParameters param;
};
struct ParsedOption {
char short_name;
std::string arg;
std::string value;
int64_t int_value;
bool verify_valid_int(int64_t min = INT64_MIN + 1,
int64_t max = INT64_MAX) const;
};
/**
* rr command-line commands. Objects of this class must be static, since
* they are expected to be immortal.
*/
class Command {
public:
static Command* command_for_name(const std::string& name);
static void print_help_all(FILE* out);
/* Runs the command with the given parameters. Returns an exit code. */
virtual int run(std::vector<std::string>& args) = 0;
void print_help(FILE* out);
static bool verify_not_option(std::vector<std::string>& args);
static bool parse_optional_trace_dir(std::vector<std::string>& args,
std::string* out);
static bool parse_option(std::vector<std::string>& args,
const OptionSpec* option_specs, size_t count,
ParsedOption* out);
template <size_t N>
static bool parse_option(std::vector<std::string>& args,
const OptionSpec (&option_specs)[N],
ParsedOption* out) {
return parse_option(args, option_specs, N, out);
}
static bool parse_literal(std::vector<std::string>& args, const char* lit);
protected:
Command(const char* name, const char* help);
virtual ~Command() {}
static bool less_than_by_name(Command* c1, Command* c2);
const char* name;
const char* help;
};
} // namespace rr
#endif // RR_COMMAND_H_