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 <memory>
14#include <ostream>
15#include <stdexcept>
16#include <string>
17#include <vector>
18
19#include "cstring.h"
20#include "error.h"
21#include "map.h"
22
23namespace P4::Util {
24
25// Command-line options processing
26class Options {
27 public:
31
33 Hide = 1 << 0,
34
41 };
42
43 // return true if processing is successful
44 using OptionProcessor = std::function<bool(const char *)>;
45
46 private:
47 void shortUsage();
48
49 protected:
50 struct Option {
51 cstring option;
52 const char *argName; // nullptr if argument is not required
53 const char *description;
54 OptionProcessor processor;
55 OptionFlags flags;
56 };
57 const char *binaryName;
58 cstring message;
59 // Build date and compile command required in couple runtime files
60 cstring compileCommand;
61 cstring buildDate;
62 std::ostream *outStream = &std::cerr;
63
64 std::map<cstring, std::shared_ptr<const Option>> options;
65 std::vector<cstring> optionOrder;
66 std::vector<const char *> additionalUsage;
67 std::vector<const char *> remainingOptions; // produced as output
68 // if true unknown options are collected in remainingOptions
69 bool collectUnknownOptions = false;
70
71 void setOutStream(std::ostream *out) { outStream = out; }
72 void registerUsage(const char *msg) { additionalUsage.push_back(msg); }
73 void registerOption(const char *option, // option to register, e.g., -c or --version
74 const char *argName, // name of option argument;
75 // nullptr if no argument expected
76 OptionProcessor processor, // function to execute when option matches
77 const char *description, // option help message
78 OptionFlags flags = OptionFlags::Default); // additional flags
79
80 explicit Options(std::string_view message)
81 : binaryName(nullptr), message(message), compileCommand("") {}
82 virtual ~Options() = default;
83
86 [[nodiscard]] virtual bool validateOptions() const;
87
88 public:
99 virtual std::vector<const char *> *process(int argc, char *const argv[]);
100
110 virtual std::vector<const char *> *process_options(int argc, char *const argv[]);
111
112 [[nodiscard]] virtual const char *getIncludePath() const = 0;
113 cstring getCompileCommand() { return compileCommand; }
114 cstring getBuildDate() { return buildDate; }
115 cstring getBinaryName() { return cstring(binaryName); }
116 virtual void usage();
117};
118
119} // namespace P4::Util
120
121#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:28
@ Default
The default option flags.
Definition lib/options.h:30
@ Hide
Hide this option from –help message.
Definition lib/options.h:33
@ OptionalArgument
Definition lib/options.h:40
Definition lib/options.h:50
Definition cstring.h:76