P4C
The P4 Compiler
Loading...
Searching...
No Matches
lib/options.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef LIB_OPTIONS_H_
9#define LIB_OPTIONS_H_
10
11#include <functional>
12#include <iostream>
13#include <ostream>
14#include <stdexcept>
15#include <string>
16#include <vector>
17
18#include "cstring.h"
19#include "error.h"
20#include "map.h"
21
22namespace P4::Util {
23
24// Command-line options processing
25class Options {
26 public:
30
32 Hide = 1 << 0,
33
40 };
41
42 // return true if processing is successful
43 using OptionProcessor = std::function<bool(const char *)>;
44
45 private:
46 void shortUsage();
47
48 protected:
49 struct Option {
50 cstring option;
51 const char *argName; // nullptr if argument is not required
52 const char *description;
53 OptionProcessor processor;
54 OptionFlags flags;
55 };
56 const char *binaryName;
57 cstring message;
58 // Build date and compile command required in couple runtime files
59 cstring compileCommand;
60 cstring buildDate;
61 std::ostream *outStream = &std::cerr;
62
63 std::map<cstring, const Option *> options;
64 std::vector<cstring> optionOrder;
65 std::vector<const char *> additionalUsage;
66 std::vector<const char *> remainingOptions; // produced as output
67 // if true unknown options are collected in remainingOptions
68 bool collectUnknownOptions = false;
69
70 void setOutStream(std::ostream *out) { outStream = out; }
71 void registerUsage(const char *msg) { additionalUsage.push_back(msg); }
72 void registerOption(const char *option, // option to register, e.g., -c or --version
73 const char *argName, // name of option argument;
74 // nullptr if no argument expected
75 OptionProcessor processor, // function to execute when option matches
76 const char *description, // option help message
77 OptionFlags flags = OptionFlags::Default); // additional flags
78
79 explicit Options(std::string_view message)
80 : binaryName(nullptr), message(message), compileCommand("") {}
81 virtual ~Options() = default;
82
85 [[nodiscard]] virtual bool validateOptions() const;
86
87 public:
98 virtual std::vector<const char *> *process(int argc, char *const argv[]);
99
109 virtual std::vector<const char *> *process_options(int argc, char *const argv[]);
110
111 [[nodiscard]] virtual const char *getIncludePath() const = 0;
112 cstring getCompileCommand() { return compileCommand; }
113 cstring getBuildDate() { return buildDate; }
114 cstring getBinaryName() { return cstring(binaryName); }
115 virtual void usage();
116};
117
118} // namespace P4::Util
119
120#endif /* LIB_OPTIONS_H_ */
virtual std::vector< const char * > * process_options(int argc, char *const argv[])
Definition lib/options.cpp:57
virtual bool validateOptions() const
Definition lib/options.cpp:164
virtual std::vector< const char * > * process(int argc, char *const argv[])
Definition lib/options.cpp:38
OptionFlags
Definition lib/options.h:27
@ Default
The default option flags.
Definition lib/options.h:29
@ Hide
Hide this option from –help message.
Definition lib/options.h:32
@ OptionalArgument
Definition lib/options.h:39
Definition lib/options.h:49
Definition cstring.h:76