]> git.ipfire.org Git - thirdparty/squid.git/blame - src/CommandLine.h
Source Format Enforcement (#763)
[thirdparty/squid.git] / src / CommandLine.h
CommitLineData
28bca1f7 1/*
f70aedc4 2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
28bca1f7
EB
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9#ifndef SQUID_COMMANDLINE_H
10#define SQUID_COMMANDLINE_H
11
12#if HAVE_GETOPT_H
13#include <getopt.h>
14#endif
15#include <vector>
16
17typedef struct option RawLongOption;
18
19/// A struct option C++ wrapper, helps with option::name copying/freeing.
20class LongOption : public RawLongOption
21{
22public:
23 LongOption();
24 explicit LongOption(const RawLongOption &);
25 LongOption(const LongOption&);
26 LongOption &operator =(const LongOption &);
27 ~LongOption();
28
29private:
30 void copy(const RawLongOption &);
31};
32
33/// Manages arguments passed to a program (i.e., main(argc, argv) parameters).
34class CommandLine
35{
36public:
37 /// expects main() input plus getopt_long(3) grammar rules for parsing argv
38 CommandLine(int argc, char *argv[], const char *shortRules, const RawLongOption *longRules);
39 CommandLine(const CommandLine &them);
40 ~CommandLine();
41
42 CommandLine &operator =(const CommandLine &);
43
44 /// \returns whether the option with optId identifier is present
45 /// When returning true, sets non-nil optValue to the found option's value.
46 /// For letter options (-x) and their --long synonyms, the letter is the ID.
47 /// For long-only --options, the ID is the configured options::val value.
48 bool hasOption(const int optId, const char **optValue = nullptr) const;
49
50 /// A callback function for forEachOption(); receives parsed options.
51 /// Must not call pushFrontOption(), hasOption() or forEachOption() -- getopt(3) uses globals!
52 typedef void Visitor(const int optId, const char *optValue);
53
54 /// calls Visitor for each of the configured command line option
55 void forEachOption(Visitor) const;
56
57 /// \returns argv[0], which is usually a program "name"
58 const char *arg0() const { return argv_[0]; }
59
60 /// \returns main()'s argc, which is traditionally missing the last/nil item
61 int argc() const { return static_cast<int>(argv_.size()) - 1; }
62
63 /// \returns main()'s argv[] which is traditionally const-wrong
64 char **argv() const { return const_cast<char**>(argv_.data()); }
65
66 /// replaces argv[0] with the new value
67 void resetArg0(const char *programName);
68
69 /// inserts a (possibly duplicated) option at the beginning of options (just after argv[0])
70 void pushFrontOption(const char *name, const char *value = nullptr);
71
72private:
73 const RawLongOption *longOptions() const { return longOptions_.size() ? longOptions_.data() : nullptr; }
74 bool nextOption(int &optId) const;
75
76 /// raw main() parameters, including argv[0] and a nil argv[argc]
77 std::vector<char *> argv_;
78
79 /* getopt_long() grammar rules */
80 const char *shortOptions_; ///< single-dash, single-letter (-x) option rules
81 std::vector<LongOption> longOptions_; ///< long --option rules
82};
83
84#endif /* SQUID_COMMANDLINE_H */
85