diff --git a/include/dwarfs/util.h b/include/dwarfs/util.h index a031a05e..a039bd23 100644 --- a/include/dwarfs/util.h +++ b/include/dwarfs/util.h @@ -24,12 +24,15 @@ #include #include #include +#include #include #include "dwarfs/types.h" namespace dwarfs { +struct iolayer; + std::string time_with_unit(double sec); std::string size_with_unit(size_t size); size_t parse_size_with_unit(std::string const& str); @@ -44,6 +47,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 (*main)(int, sys_char**, iolayer const&)); size_t utf8_display_width(char const* p, size_t len); size_t utf8_display_width(std::string const& str); diff --git a/include/dwarfs_tool_main.h b/include/dwarfs_tool_main.h index 44a92c40..e263dfb1 100644 --- a/include/dwarfs_tool_main.h +++ b/include/dwarfs_tool_main.h @@ -22,6 +22,7 @@ #pragma once #include +#include #include "dwarfs/types.h" @@ -35,18 +36,23 @@ namespace dwarfs { struct iolayer; +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(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(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(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(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 65db4f21..72ee664a 100644 --- a/src/dwarfs/util.cpp +++ b/src/dwarfs/util.cpp @@ -136,6 +136,31 @@ std::string sys_string_to_string(sys_string const& in) { #endif } +sys_string string_to_sys_string(std::string const& in) { +#ifdef _WIN32 + auto tmp = utf8::utf8to16(in); + sys_string rv(tmp.size(), 0); + std::transform(tmp.begin(), tmp.end(), rv.begin(), + [](char16_t c) { return static_cast(c); }); + return rv; +#else + return in; +#endif +} + +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); +} + size_t utf8_display_width(char const* p, size_t len) { char const* const e = p + len; size_t rv = 0; diff --git a/src/dwarfs_main.cpp b/src/dwarfs_main.cpp index 3d8c5c56..47a4fc67 100644 --- a/src/dwarfs_main.cpp +++ b/src/dwarfs_main.cpp @@ -1389,4 +1389,8 @@ 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) { + return call_sys_main_iolayer(args, iol, dwarfs_main); +} + } // namespace dwarfs diff --git a/src/dwarfsbench_main.cpp b/src/dwarfsbench_main.cpp index 0482001b..178721b5 100644 --- a/src/dwarfsbench_main.cpp +++ b/src/dwarfsbench_main.cpp @@ -141,4 +141,8 @@ 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) { + return call_sys_main_iolayer(args, iol, dwarfsbench_main); +} + } // namespace dwarfs diff --git a/src/dwarfsck_main.cpp b/src/dwarfsck_main.cpp index 8409857b..b3c82733 100644 --- a/src/dwarfsck_main.cpp +++ b/src/dwarfsck_main.cpp @@ -208,4 +208,8 @@ 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) { + return call_sys_main_iolayer(args, iol, dwarfsck_main); +} + } // namespace dwarfs diff --git a/src/dwarfsextract_main.cpp b/src/dwarfsextract_main.cpp index 02eb8dc5..8c5f6a82 100644 --- a/src/dwarfsextract_main.cpp +++ b/src/dwarfsextract_main.cpp @@ -201,4 +201,8 @@ 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) { + return call_sys_main_iolayer(args, iol, dwarfsextract_main); +} + } // namespace dwarfs diff --git a/src/mkdwarfs_main.cpp b/src/mkdwarfs_main.cpp index d7eae5d0..c01245eb 100644 --- a/src/mkdwarfs_main.cpp +++ b/src/mkdwarfs_main.cpp @@ -1289,4 +1289,8 @@ 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) { + return call_sys_main_iolayer(args, iol, mkdwarfs_main); +} + } // namespace dwarfs