Mercurial > code
annotate C++/OptionParser.cpp @ 229:96ff112d05cf
Add OptionParser, getopt(3) replacement
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 17 Jun 2014 17:11:56 +0200 |
parents | |
children | ff2db0ed78f1 |
rev | line source |
---|---|
229
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * OptionParser.cpp -- safe getopt(3) replacement |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <iostream> |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <iomanip> |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "OptionParser.h" |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 /* -------------------------------------------------------- |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 * Option class |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 * -------------------------------------------------------- */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 Option::Option(const std::string &name, const std::string &help, Type type, int flags) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 : m_name(name) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 , m_help(help) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 , m_type(type) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 , m_flags(flags) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 const std::string &Option::name() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 return m_name; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 const std::string &Option::help() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 return m_help; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 Option::Type Option::type() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 return m_type; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 int Option::flags() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 return m_flags; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 /* -------------------------------------------------------- |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 * OptionValue class |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 * -------------------------------------------------------- */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 OptionValue::OptionValue(const std::string &name) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 : m_name(name) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 , m_enabled(true) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 OptionValue::OptionValue(const std::string &name, const std::string &value) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 : m_name(name) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 , m_value(value) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 const std::string &OptionValue::name() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 return m_name; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 const std::string &OptionValue::value() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 return m_value; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 OptionValue::operator bool() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 return m_enabled; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 OptionValue::operator std::string() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 return m_value; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 /* -------------------------------------------------------- |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 * OptionResult class |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 * -------------------------------------------------------- */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 auto OptionResult::begin() -> decltype(m_values.begin()) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 return m_values.begin(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 auto OptionResult::begin() const -> decltype(m_values.begin()) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 return m_values.begin(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 auto OptionResult::cbegin() const -> decltype(m_values.cbegin()) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 return m_values.begin(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 auto OptionResult::end() -> decltype(m_values.end()) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 return m_values.end(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 auto OptionResult::end() const -> decltype(m_values.end()) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 return m_values.end(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 auto OptionResult::cend() const -> decltype(m_values.cend()) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 return m_values.cend(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 int OptionResult::count() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 return static_cast<int>(m_values.size()); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 int OptionResult::total() const |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 return m_total; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 /* -------------------------------------------------------- |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 * OptionParser class |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 * -------------------------------------------------------- */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 void OptionParser::add(Option &&option) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 const auto &name = option.name(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 if (name.length() > m_maxlength) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 m_maxlength = name.length(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 m_options.emplace(std::make_pair(name, std::move(option))); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 void OptionParser::add(const Option &option) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 add(const_cast<Option &>(option)); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 OptionResult OptionParser::parse(int argc, char **argv, int flags) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 OptionResult result; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 int i; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 for (i = 0; i < argc; ++i) { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 /* Not a valid option at all? */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 if (m_options.count(argv[i]) == 0) { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 log(argv[i], std::string(argv[i]) + " is not a valid option"); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 if (flags & Strict) { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 usage(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 break; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 } else |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 continue; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 /* |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 * At this step, we have an option name valid, check if it requires |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 * an argument or not. |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 const auto &option = m_options.at(argv[i]); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 const auto &name = option.name(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 auto type = option.type(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 /* |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 * Already present and must appears only once? |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 if (option.flags() & Option::Single && m_placed.count(name) > 0) { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 if (!(flags & Silent)) { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 log(name, "option " + name + " must appear only once"); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 if (flags & Strict) { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 usage(); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 break; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 } else if (flags & Strict) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 break; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 /* |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 * Need an argument or it is a simple switch ? |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 */ |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 if (type == Option::Type::Switch) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 result.m_values.push_back(OptionValue(name)); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 else { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 if (i + 1 >= argc) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 result.m_values.push_back(OptionValue(name, "")); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 else { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 result.m_values.push_back(OptionValue(name, argv[i + 1])); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 ++ i; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 m_placed.insert(name); |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 result.m_total = i; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 return result; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 void OptionParser::usage() |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 std::cout << "options available: " << std::endl; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 for (const auto &option : m_options) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 std::cout << " " << std::setw(m_maxlength) << option.second.name() << "\t" << option.second.help() << std::endl; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 } |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 void OptionParser::log(const std::string &, const std::string &error) |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 { |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 std::cout << error << std::endl; |
96ff112d05cf
Add OptionParser, getopt(3) replacement
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 } |