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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }