diff --git a/include/dwarfs/util.h b/include/dwarfs/util.h index a039bd23..236029fa 100644 --- a/include/dwarfs/util.h +++ b/include/dwarfs/util.h @@ -26,6 +26,7 @@ #include #include #include +#include #include "dwarfs/types.h" @@ -49,7 +50,10 @@ inline std::string u8string_to_string(std::u8string const& in) { std::string sys_string_to_string(sys_string const& in); sys_string string_to_sys_string(std::string const& in); -int call_sys_main_iolayer(std::span args, iolayer const& iol, +int call_sys_main_iolayer(std::span args, iolayer const& iol, + int (*main)(int, sys_char**, iolayer const&)); + +int call_sys_main_iolayer(std::span args, iolayer const& iol, int (*main)(int, sys_char**, iolayer const&)); size_t utf8_display_width(char const* p, size_t len); diff --git a/include/dwarfs_tool_main.h b/include/dwarfs_tool_main.h index e263dfb1..a79e6bb0 100644 --- a/include/dwarfs_tool_main.h +++ b/include/dwarfs_tool_main.h @@ -23,6 +23,8 @@ #include #include +#include +#include #include "dwarfs/types.h" @@ -36,23 +38,28 @@ namespace dwarfs { struct iolayer; -int mkdwarfs_main(std::span args, iolayer const& iol); +int mkdwarfs_main(std::span args, iolayer const& iol); +int mkdwarfs_main(std::span args, iolayer const& iol); int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol); int mkdwarfs_main(int argc, sys_char** argv); -int dwarfsck_main(std::span args, iolayer const& iol); +int dwarfsck_main(std::span args, iolayer const& iol); +int dwarfsck_main(std::span args, iolayer const& iol); int dwarfsck_main(int argc, sys_char** argv, iolayer const& iol); int dwarfsck_main(int argc, sys_char** argv); -int dwarfsextract_main(std::span args, iolayer const& iol); +int dwarfsextract_main(std::span args, iolayer const& iol); +int dwarfsextract_main(std::span args, iolayer const& iol); int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol); int dwarfsextract_main(int argc, sys_char** argv); -int dwarfsbench_main(std::span args, iolayer const& iol); +int dwarfsbench_main(std::span args, iolayer const& iol); +int dwarfsbench_main(std::span args, iolayer const& iol); int dwarfsbench_main(int argc, sys_char** argv, iolayer const& iol); int dwarfsbench_main(int argc, sys_char** argv); -int dwarfs_main(std::span args, iolayer const& iol); +int dwarfs_main(std::span args, iolayer const& iol); +int dwarfs_main(std::span args, iolayer const& iol); int dwarfs_main(int argc, sys_char** argv, iolayer const& iol); int dwarfs_main(int argc, sys_char** argv); diff --git a/src/dwarfs/util.cpp b/src/dwarfs/util.cpp index 72ee664a..f23b7e29 100644 --- a/src/dwarfs/util.cpp +++ b/src/dwarfs/util.cpp @@ -47,6 +47,21 @@ inline std::string trimmed(std::string in) { } return in; } + +template +int call_sys_main_iolayer_impl(std::span args, iolayer const& iol, + int (*main)(int, sys_char**, iolayer const&)) { + std::vector argv; + std::vector argv_ptrs; + argv.reserve(args.size()); + argv_ptrs.reserve(args.size()); + for (auto const& arg : args) { + argv.emplace_back(string_to_sys_string(std::string(arg))); + argv_ptrs.emplace_back(argv.back().data()); + } + return main(argv_ptrs.size(), argv_ptrs.data(), iol); +} + } // namespace std::string size_with_unit(size_t size) { @@ -148,17 +163,14 @@ sys_string string_to_sys_string(std::string const& in) { #endif } -int call_sys_main_iolayer(std::span args, iolayer const& iol, +int call_sys_main_iolayer(std::span args, iolayer const& iol, int (*main)(int, sys_char**, iolayer const&)) { - std::vector argv; - std::vector argv_ptrs; - argv.reserve(args.size()); - argv_ptrs.reserve(args.size()); - for (auto const& arg : args) { - argv.emplace_back(string_to_sys_string(arg)); - argv_ptrs.emplace_back(argv.back().data()); - } - return main(argv_ptrs.size(), argv_ptrs.data(), iol); + return call_sys_main_iolayer_impl(args, iol, main); +} + +int call_sys_main_iolayer(std::span args, iolayer const& iol, + int (*main)(int, sys_char**, iolayer const&)) { + return call_sys_main_iolayer_impl(args, iol, main); } size_t utf8_display_width(char const* p, size_t len) { diff --git a/src/dwarfs_main.cpp b/src/dwarfs_main.cpp index 47a4fc67..672eba9e 100644 --- a/src/dwarfs_main.cpp +++ b/src/dwarfs_main.cpp @@ -1389,7 +1389,11 @@ int dwarfs_main(int argc, sys_char** argv) { return dwarfs_main(argc, argv, iolayer::system_default()); } -int dwarfs_main(std::span args, iolayer const& iol) { +int dwarfs_main(std::span args, iolayer const& iol) { + return call_sys_main_iolayer(args, iol, dwarfs_main); +} + +int dwarfs_main(std::span args, iolayer const& iol) { return call_sys_main_iolayer(args, iol, dwarfs_main); } diff --git a/src/dwarfsbench_main.cpp b/src/dwarfsbench_main.cpp index 178721b5..da11572b 100644 --- a/src/dwarfsbench_main.cpp +++ b/src/dwarfsbench_main.cpp @@ -141,7 +141,11 @@ int dwarfsbench_main(int argc, sys_char** argv) { return dwarfsbench_main(argc, argv, iolayer::system_default()); } -int dwarfsbench_main(std::span args, iolayer const& iol) { +int dwarfsbench_main(std::span args, iolayer const& iol) { + return call_sys_main_iolayer(args, iol, dwarfsbench_main); +} + +int dwarfsbench_main(std::span args, iolayer const& iol) { return call_sys_main_iolayer(args, iol, dwarfsbench_main); } diff --git a/src/dwarfsck_main.cpp b/src/dwarfsck_main.cpp index b3c82733..5cf666ef 100644 --- a/src/dwarfsck_main.cpp +++ b/src/dwarfsck_main.cpp @@ -208,7 +208,11 @@ int dwarfsck_main(int argc, sys_char** argv) { return dwarfsck_main(argc, argv, iolayer::system_default()); } -int dwarfsck_main(std::span args, iolayer const& iol) { +int dwarfsck_main(std::span args, iolayer const& iol) { + return call_sys_main_iolayer(args, iol, dwarfsck_main); +} + +int dwarfsck_main(std::span args, iolayer const& iol) { return call_sys_main_iolayer(args, iol, dwarfsck_main); } diff --git a/src/dwarfsextract_main.cpp b/src/dwarfsextract_main.cpp index 8c5f6a82..2694afea 100644 --- a/src/dwarfsextract_main.cpp +++ b/src/dwarfsextract_main.cpp @@ -201,7 +201,11 @@ int dwarfsextract_main(int argc, sys_char** argv) { return dwarfsextract_main(argc, argv, iolayer::system_default()); } -int dwarfsextract_main(std::span args, iolayer const& iol) { +int dwarfsextract_main(std::span args, iolayer const& iol) { + return call_sys_main_iolayer(args, iol, dwarfsextract_main); +} + +int dwarfsextract_main(std::span args, iolayer const& iol) { return call_sys_main_iolayer(args, iol, dwarfsextract_main); } diff --git a/src/mkdwarfs_main.cpp b/src/mkdwarfs_main.cpp index c01245eb..3c9545c3 100644 --- a/src/mkdwarfs_main.cpp +++ b/src/mkdwarfs_main.cpp @@ -1289,7 +1289,11 @@ int mkdwarfs_main(int argc, sys_char** argv) { return mkdwarfs_main(argc, argv, iolayer::system_default()); } -int mkdwarfs_main(std::span args, iolayer const& iol) { +int mkdwarfs_main(std::span args, iolayer const& iol) { + return call_sys_main_iolayer(args, iol, mkdwarfs_main); +} + +int mkdwarfs_main(std::span args, iolayer const& iol) { return call_sys_main_iolayer(args, iol, mkdwarfs_main); } diff --git a/test/categorizer_test.cpp b/test/categorizer_test.cpp index 03b384b9..0d980632 100644 --- a/test/categorizer_test.cpp +++ b/test/categorizer_test.cpp @@ -57,9 +57,7 @@ TEST_P(categorizer_test, end_to_end) { test::test_iolayer iolayer(input); - std::vector args{"mkdwarfs", "-i", "/", - "-o", "-", "--categorize"}; - + auto args = test::parse_args("mkdwarfs -i / -o - --categorize"); auto exit_code = mkdwarfs_main(args, iolayer.get()); EXPECT_EQ(exit_code, 0); diff --git a/test/test_helpers.cpp b/test/test_helpers.cpp index 22a3f004..238d2957 100644 --- a/test/test_helpers.cpp +++ b/test/test_helpers.cpp @@ -469,5 +469,11 @@ std::optional find_binary(std::string_view name) { return std::nullopt; } +std::vector parse_args(std::string_view args) { + std::vector rv; + folly::split(' ', args, rv); + return rv; +} + } // namespace test } // namespace dwarfs diff --git a/test/test_helpers.h b/test/test_helpers.h index 98b0d3d4..7db84222 100644 --- a/test/test_helpers.h +++ b/test/test_helpers.h @@ -183,4 +183,6 @@ std::optional find_binary(std::string_view name); std::span const> test_dirtree(); +std::vector parse_args(std::string_view args); + } // namespace dwarfs::test