Mercurial > code
annotate modules/options/options.cpp @ 618:1ae8106369e5
Options: initial reimport, closes #705
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 26 Sep 2017 09:50:02 +0200 |
parents | |
children |
rev | line source |
---|---|
618
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * options.cpp -- parse Unix command line options |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2015-2017 David Demelier <markand@malikania.fr> |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <cassert> |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include "options.hpp" |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 namespace option { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 namespace { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 using iterator = std::vector<std::string>::iterator; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 using args = std::vector<std::string>; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 inline bool is_option(const std::string& arg) noexcept |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 return arg.size() >= 2 && arg[0] == '-'; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 inline bool is_long_option(const std::string& arg) noexcept |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 assert(is_option(arg)); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 return arg.size() >= 3 && arg[1] == '-'; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 inline bool is_short_simple(const std::string& arg) noexcept |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 assert(is_option(arg) && !is_long_option(arg)); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 return arg.size() == 2; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 void parse_long_option(result& result, args& args, iterator& it, iterator& end, const options& definition) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 auto arg = *it++; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 auto opt = definition.find(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 if (opt == definition.end()) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 throw invalid_option(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 // Need argument? |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 if (opt->second) { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 if (it == end || is_option(*it)) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 throw missing_value(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 result.insert(std::make_pair(arg, *it++)); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 it = args.erase(args.begin(), it); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 end = args.end(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 } else { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 result.insert(std::make_pair(arg, "")); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 it = args.erase(args.begin()); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 end = args.end(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 void parse_short_option_simple(result& result, args& args, iterator& it, iterator &end, const options& definition) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 /* |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 * Here two cases: |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 * |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 * -v (no option) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 * -c value |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 */ |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 auto arg = *it++; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 auto opt = definition.find(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 if (opt == definition.end()) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 throw invalid_option(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 // Need argument? |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 if (opt->second) { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 if (it == end || is_option(*it)) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 throw missing_value(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 result.insert(std::make_pair(arg, *it++)); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 it = args.erase(args.begin(), it); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 end = args.end(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 } else { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 result.insert(std::make_pair(arg, "")); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 it = args.erase(args.begin()); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 end = args.end(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 void parse_short_option_compressed(result& result, args& args, iterator& it, iterator &end, const options& definition) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 /* |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 * Here multiple scenarios: |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 * |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 * 1. -abc (-a -b -c if all are simple boolean arguments) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 * 2. -vc foo.conf (-v -c foo.conf if -c is argument dependant) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 * 3. -vcfoo.conf (-v -c foo.conf also) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 */ |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 auto value = it->substr(1); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 auto len = value.length(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 int toremove = 1; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 for (std::size_t i = 0; i < len; ++i) { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 auto arg = std::string{'-'} + value[i]; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 auto opt = definition.find(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 if (opt == definition.end()) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 throw invalid_option(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 if (opt->second) { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 if (i == (len - 1)) { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 // End of string, get the next argument (see 2.). |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 if (++it == end || is_option(*it)) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 throw missing_value(arg); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 result.insert(std::make_pair(arg, *it)); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 toremove += 1; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 } else { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 result.insert(std::make_pair(arg, value.substr(i + 1))); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 i = len; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 } else |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 result.insert(std::make_pair(arg, "")); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 it = args.erase(args.begin(), args.begin() + toremove); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 end = args.end(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 void parse_short_option(result& result, args& args, iterator& it, iterator &end, const options& definition) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 if (is_short_simple(*it)) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 parse_short_option_simple(result, args, it, end, definition); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 else |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 parse_short_option_compressed(result, args, it, end, definition); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 } // !namespace |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 result read(std::vector<std::string>& args, const options& definition) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 result result; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 auto it = args.begin(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 auto end = args.end(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 while (it != end) { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 if (!is_option(*it)) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 break; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 if (is_long_option(*it)) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 parse_long_option(result, args, it, end, definition); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 else |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 parse_short_option(result, args, it, end, definition); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 return result; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 result read(int& argc, char**& argv, const options& definition) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 { |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 std::vector<std::string> args; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 for (int i = 0; i < argc; ++i) |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 args.push_back(argv[i]); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 auto before = args.size(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 auto result = read(args, definition); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 argc -= before - args.size(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 argv += before - args.size(); |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 return result; |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 } |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 |
1ae8106369e5
Options: initial reimport, closes #705
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 } // !option |