chore: add another *_main overload that always accepts utf8 args

This is mostly for convenient use from within the test suite.
This commit is contained in:
Marcus Holland-Moritz 2023-12-28 12:14:12 +01:00
parent 67a4de0d52
commit 676e46dd60
8 changed files with 58 additions and 0 deletions

View File

@ -24,12 +24,15 @@
#include <chrono>
#include <cstddef>
#include <filesystem>
#include <span>
#include <string>
#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<char const*> 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);

View File

@ -22,6 +22,7 @@
#pragma once
#include <iosfwd>
#include <span>
#include "dwarfs/types.h"
@ -35,18 +36,23 @@ namespace dwarfs {
struct iolayer;
int mkdwarfs_main(std::span<char const*> 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<char const*> 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<char const*> 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<char const*> 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<char const*> args, iolayer const& iol);
int dwarfs_main(int argc, sys_char** argv, iolayer const& iol);
int dwarfs_main(int argc, sys_char** argv);

View File

@ -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<sys_char>(c); });
return rv;
#else
return in;
#endif
}
int call_sys_main_iolayer(std::span<char const*> args, iolayer const& iol,
int (*main)(int, sys_char**, iolayer const&)) {
std::vector<sys_string> argv;
std::vector<sys_char*> 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;

View File

@ -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<char const*> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfs_main);
}
} // namespace dwarfs

View File

@ -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<char const*> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsbench_main);
}
} // namespace dwarfs

View File

@ -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<char const*> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsck_main);
}
} // namespace dwarfs

View File

@ -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<char const*> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, dwarfsextract_main);
}
} // namespace dwarfs

View File

@ -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<char const*> args, iolayer const& iol) {
return call_sys_main_iolayer(args, iol, mkdwarfs_main);
}
} // namespace dwarfs