File src/Invocation.cpp changed (mode: 100644) (index 51ef059..e8bd63b) |
29 |
29 |
#include <boost/program_options/parsers.hpp> |
#include <boost/program_options/parsers.hpp> |
30 |
30 |
#include <boost/program_options/variables_map.hpp> |
#include <boost/program_options/variables_map.hpp> |
31 |
31 |
#include <boost/range/adaptor/reversed.hpp> |
#include <boost/range/adaptor/reversed.hpp> |
32 |
|
#include <boost/tokenizer.hpp> |
|
33 |
32 |
|
|
|
33 |
|
#include "utils/args.hpp" |
34 |
34 |
#include "utils/containers.hpp" |
#include "utils/containers.hpp" |
35 |
35 |
#include "utils/strings.hpp" |
#include "utils/strings.hpp" |
36 |
36 |
|
|
37 |
37 |
namespace po = boost::program_options; |
namespace po = boost::program_options; |
38 |
38 |
|
|
39 |
|
std::vector<std::string> breakIntoArgs(const std::string &line); |
|
40 |
39 |
static std::vector<std::string> applyAlias( |
static std::vector<std::string> applyAlias( |
41 |
40 |
const std::vector<std::string> &alias, const std::vector<std::string> &args, |
const std::vector<std::string> &alias, const std::vector<std::string> &args, |
42 |
41 |
bool completion); |
bool completion); |
|
... |
... |
Invocation::processOptions(bool completion) |
165 |
164 |
} |
} |
166 |
165 |
} |
} |
167 |
166 |
|
|
168 |
|
/** |
|
169 |
|
* @brief Tokenize the command line, respecting escapes and quotes. |
|
170 |
|
* |
|
171 |
|
* @param line Line to parse. |
|
172 |
|
* |
|
173 |
|
* @returns Array of arguments. |
|
174 |
|
*/ |
|
175 |
|
std::vector<std::string> |
|
176 |
|
breakIntoArgs(const std::string &line) |
|
177 |
|
{ |
|
178 |
|
boost::escaped_list_separator<char> sep("\\", " ", "\"'"); |
|
179 |
|
boost::tokenizer<boost::escaped_list_separator<char>> tok(line, sep); |
|
180 |
|
return std::vector<std::string>(tok.begin(), tok.end()); |
|
181 |
|
} |
|
182 |
|
|
|
183 |
167 |
/** |
/** |
184 |
168 |
* @brief Performs alias argument substitution. |
* @brief Performs alias argument substitution. |
185 |
169 |
* |
* |
File src/utils/args.hpp copied from file src/main.cpp (similarity 53%) (mode: 100644) (index b361b25..4524a64) |
1 |
|
// Copyright (C) 2015 xaizek <xaizek@openmailbox.org> |
|
|
1 |
|
// Copyright (C) 2016 xaizek <xaizek@openmailbox.org> |
2 |
2 |
// |
// |
3 |
3 |
// This file is part of dit. |
// This file is part of dit. |
4 |
4 |
// |
// |
|
15 |
15 |
// You should have received a copy of the GNU General Public License |
// You should have received a copy of the GNU General Public License |
16 |
16 |
// along with dit. If not, see <http://www.gnu.org/licenses/>. |
// along with dit. If not, see <http://www.gnu.org/licenses/>. |
17 |
17 |
|
|
18 |
|
#include <cstdlib> |
|
|
18 |
|
#ifndef DIT__UTILS__ARGS_HPP__ |
|
19 |
|
#define DIT__UTILS__ARGS_HPP__ |
19 |
20 |
|
|
20 |
|
#include <iostream> |
|
21 |
|
#include <stdexcept> |
|
|
21 |
|
#include <string> |
22 |
22 |
#include <vector> |
#include <vector> |
23 |
23 |
|
|
24 |
|
#include "Dit.hpp" |
|
|
24 |
|
#include <boost/tokenizer.hpp> |
25 |
25 |
|
|
26 |
|
int |
|
27 |
|
main(int argc, char *argv[]) |
|
|
26 |
|
/** |
|
27 |
|
* @brief Tokenize the command line, respecting escapes and quotes. |
|
28 |
|
* |
|
29 |
|
* @param line Line to parse. |
|
30 |
|
* |
|
31 |
|
* @returns Array of arguments. |
|
32 |
|
*/ |
|
33 |
|
inline std::vector<std::string> |
|
34 |
|
breakIntoArgs(const std::string &line) |
28 |
35 |
{ |
{ |
29 |
|
try { |
|
30 |
|
return Dit({ argv, argv + argc }).run(); |
|
31 |
|
} catch (std::exception &e) { |
|
32 |
|
std::cerr << "Error: " << e.what() << std::endl; |
|
33 |
|
return EXIT_FAILURE; |
|
34 |
|
} |
|
|
36 |
|
boost::escaped_list_separator<char> sep("\\", " ", "\"'"); |
|
37 |
|
boost::tokenizer<boost::escaped_list_separator<char>> tok(line, sep); |
|
38 |
|
return { tok.begin(), tok.end() }; |
35 |
39 |
} |
} |
|
40 |
|
|
|
41 |
|
#endif // DIT__UTILS__ARGS_HPP__ |
File tests/utils/args.cpp copied from file src/main.cpp (similarity 63%) (mode: 100644) (index b361b25..05d9a59) |
1 |
|
// Copyright (C) 2015 xaizek <xaizek@openmailbox.org> |
|
|
1 |
|
// Copyright (C) 2016 xaizek <xaizek@openmailbox.org> |
2 |
2 |
// |
// |
3 |
3 |
// This file is part of dit. |
// This file is part of dit. |
4 |
4 |
// |
// |
|
15 |
15 |
// You should have received a copy of the GNU General Public License |
// You should have received a copy of the GNU General Public License |
16 |
16 |
// along with dit. If not, see <http://www.gnu.org/licenses/>. |
// along with dit. If not, see <http://www.gnu.org/licenses/>. |
17 |
17 |
|
|
18 |
|
#include <cstdlib> |
|
|
18 |
|
#include "Catch/catch.hpp" |
19 |
19 |
|
|
20 |
|
#include <iostream> |
|
21 |
|
#include <stdexcept> |
|
|
20 |
|
#include <string> |
22 |
21 |
#include <vector> |
#include <vector> |
23 |
22 |
|
|
24 |
|
#include "Dit.hpp" |
|
|
23 |
|
#include "utils/args.hpp" |
25 |
24 |
|
|
26 |
|
int |
|
27 |
|
main(int argc, char *argv[]) |
|
|
25 |
|
TEST_CASE("Empty input", "[utils][args]") |
28 |
26 |
{ |
{ |
29 |
|
try { |
|
30 |
|
return Dit({ argv, argv + argc }).run(); |
|
31 |
|
} catch (std::exception &e) { |
|
32 |
|
std::cerr << "Error: " << e.what() << std::endl; |
|
33 |
|
return EXIT_FAILURE; |
|
34 |
|
} |
|
|
27 |
|
REQUIRE(breakIntoArgs(std::string()).empty()); |
|
28 |
|
} |
|
29 |
|
|
|
30 |
|
TEST_CASE("Benign input", "[utils][args]") |
|
31 |
|
{ |
|
32 |
|
std::vector<std::string> args = breakIntoArgs("a b c"); |
|
33 |
|
REQUIRE(args == (std::vector<std::string>{ "a", "b", "c" })); |
35 |
34 |
} |
} |