Joedb 10.0.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Arguments.cpp
Go to the documentation of this file.
3
4namespace joedb
5{
6 Arguments::Argument::Argument(const char *argv): s(argv), used(false)
7 {
8 if (s[0] == '-' && s[1] == '-')
9 option = std::string_view(s.data() + 2, s.size() - 2);
10 }
11
12 void Arguments::update_index()
13 {
14 while (index < argc && args[index].used)
15 index++;
16 }
17
18 std::string_view Arguments::use_index()
19 {
20 JOEDB_DEBUG_ASSERT(index < argc);
21 args[index].used = true;
22 const auto result = args[index].s;
23 update_index();
24 return result;
25 }
26
27 Arguments::Arguments(int argc, const char * const *argv):
28 argc(argc),
29 argv(argv)
30 {
31 args.reserve(argc);
32 for (int i = 0; i < argc; i++)
33 args.emplace_back(argv[i]);
34 }
35
36 bool Arguments::has_flag(const char * name)
37 {
38 options.emplace_back(name, std::string_view{});
39
40 for (auto &arg: args)
41 {
42 if (arg.option == name)
43 {
44 arg.used = true;
45 update_index();
46 return true;
47 }
48 }
49
50 return false;
51 }
52
54 (
55 const char * name,
56 const char * description,
57 const char * default_string
58 )
59 {
60 options.emplace_back(name, description);
61
62 for (size_t i = 0; i < args.size() - 1; i++)
63 {
64 if (args[i].option == name)
65 {
66 args[i].used = true;
67 args[i + 1].used = true;
68 update_index();
69 return args[i + 1].s;
70 }
71 }
72
73 return default_string;
74 }
75
77 (
78 const char * name,
79 const std::vector<const char *> &labels,
80 size_t default_index
81 )
82 {
83 options.emplace_back(name, labels, default_index);
84
85 for (size_t i = 0; i < args.size() - 1; i++)
86 {
87 if (args[i].option == name)
88 {
89 args[i].used = true;
90 args[i + 1].used = true;
91 update_index();
92
93 for (int j = int(labels.size()); --j >= 0;)
94 if (labels[j] == args[i + 1].s)
95 return size_t(j);
96
97 throw Exception
98 (
99 std::string("invalid value for option ") + std::string(args[i].s) +
100 ": " + std::string(args[i + 1].s)
101 );
102 }
103 }
104
105 return default_index;
106 }
107
108 std::string_view Arguments::get_next()
109 {
110 return get_next(nullptr);
111 }
112
113 std::string_view Arguments::get_next(const char * parameter)
114 {
115 if (parameter)
116 options.emplace_back(parameter);
117
118 if (index < argc)
119 return use_index();
120 else
121 {
122 missing_arg = true;
123 return std::string_view{};
124 }
125 }
126
127 bool Arguments::peek(const char *s)
128 {
129 if (index < argc && args[index].s == s)
130 {
131 use_index();
132 return true;
133 }
134 else
135 return false;
136 }
137
138 void Arguments::add_parameter(const char * parameter)
139 {
140 options.emplace_back(parameter);
141 }
142
143 std::ostream &Arguments::print_help(std::ostream &out) const
144 {
145 out << "usage: " << args[0].s;
146
147 for (const auto &option: options)
148 {
149 if (option.name.data())
150 {
151 out << " [--";
152 out << option.name;
153 if (option.parameter.data())
154 out << " <" << option.parameter << '>';
155 else if (option.labels)
156 {
157 for (size_t i = 0; i < option.labels->size(); i++)
158 {
159 out << (i > 0 ? '|' : ' ');
160 out << option.labels->at(i);
161 if (size_t(option.default_index) == i)
162 out << '*';
163 }
164 }
165 out << ']';
166 }
167 else if (option.parameter.data())
168 out << ' ' << option.parameter;
169 }
170
171 out << '\n';
172
173 return out;
174 }
175}
bool peek(const char *s)
size_t get_enum_option(const char *name, const std::vector< const char * > &labels, size_t default_index)
Definition Arguments.cpp:77
std::string_view get_next()
std::string_view get_string_option(const char *name, const char *description, const char *default_string)
Definition Arguments.cpp:54
bool has_flag(const char *name)
Definition Arguments.cpp:36
std::ostream & print_help(std::ostream &out) const
void add_parameter(const char *parameter)
#define JOEDB_DEBUG_ASSERT(x)
assertion tested in debug mode
Definition assert.h:19
Definition Blob.h:7