From 1dcab5996e4ee94f430cd94ce02c992a0eff3a86 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 26 Jun 2023 22:47:20 +0200 Subject: [PATCH] Use wmain() on Windows --- include/dwarfs/types.h | 8 ++++++++ include/dwarfs_tool_main.h | 16 ++++++++++++---- src/dwarfsbench.cpp | 2 +- src/dwarfsbench_main.cpp | 2 +- src/dwarfsck.cpp | 2 +- src/dwarfsck_main.cpp | 10 ++++++---- src/dwarfsextract.cpp | 2 +- src/dwarfsextract_main.cpp | 2 +- src/mkdwarfs.cpp | 2 +- src/mkdwarfs_main.cpp | 6 +++--- 10 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/dwarfs/types.h b/include/dwarfs/types.h index abc8953e..b83aec7f 100644 --- a/include/dwarfs/types.h +++ b/include/dwarfs/types.h @@ -27,4 +27,12 @@ namespace dwarfs { using file_off_t = int64_t; +#ifdef _WIN32 +using sys_char = wchar_t; +using sys_string = std::wstring; +#else +using sys_char = char; +using sys_string = std::string; +#endif + } // namespace dwarfs diff --git a/include/dwarfs_tool_main.h b/include/dwarfs_tool_main.h index 6998fe3b..60d1e3a3 100644 --- a/include/dwarfs_tool_main.h +++ b/include/dwarfs_tool_main.h @@ -21,12 +21,20 @@ #pragma once +#include "dwarfs/types.h" + +#ifdef _WIN32 +#define SYS_MAIN wmain +#else +#define SYS_MAIN main +#endif + namespace dwarfs { -int mkdwarfs_main(int argc, char** argv); -int dwarfsck_main(int argc, char** argv); -int dwarfsextract_main(int argc, char** argv); -int dwarfsbench_main(int argc, char** argv); +int mkdwarfs_main(int argc, sys_char** argv); +int dwarfsck_main(int argc, sys_char** argv); +int dwarfsextract_main(int argc, sys_char** argv); +int dwarfsbench_main(int argc, sys_char** argv); int dwarfs_main(int argc, char** argv); } // namespace dwarfs diff --git a/src/dwarfsbench.cpp b/src/dwarfsbench.cpp index a0799f68..ecb01188 100644 --- a/src/dwarfsbench.cpp +++ b/src/dwarfsbench.cpp @@ -22,7 +22,7 @@ #include "dwarfs/error.h" #include "dwarfs_tool_main.h" -int main(int argc, char** argv) { +int SYS_MAIN(int argc, dwarfs::sys_char** argv) { return dwarfs::safe_main( [&] { return dwarfs::dwarfsbench_main(argc, argv); }); } diff --git a/src/dwarfsbench_main.cpp b/src/dwarfsbench_main.cpp index 9cfec3c7..57158ff5 100644 --- a/src/dwarfsbench_main.cpp +++ b/src/dwarfsbench_main.cpp @@ -41,7 +41,7 @@ namespace po = boost::program_options; namespace dwarfs { -int dwarfsbench_main(int argc, char** argv) { +int dwarfsbench_main(int argc, sys_char** argv) { std::string filesystem, cache_size_str, lock_mode_str, decompress_ratio_str, log_level; size_t num_workers; diff --git a/src/dwarfsck.cpp b/src/dwarfsck.cpp index 8c338dd4..e1e505e6 100644 --- a/src/dwarfsck.cpp +++ b/src/dwarfsck.cpp @@ -22,6 +22,6 @@ #include "dwarfs/error.h" #include "dwarfs_tool_main.h" -int main(int argc, char** argv) { +int SYS_MAIN(int argc, dwarfs::sys_char** argv) { return dwarfs::safe_main([&] { return dwarfs::dwarfsck_main(argc, argv); }); } diff --git a/src/dwarfsck_main.cpp b/src/dwarfsck_main.cpp index 7f08d1e4..d8cfc98d 100644 --- a/src/dwarfsck_main.cpp +++ b/src/dwarfsck_main.cpp @@ -43,7 +43,7 @@ namespace dwarfs { namespace po = boost::program_options; -int dwarfsck_main(int argc, char** argv) { +int dwarfsck_main(int argc, sys_char** argv) { const size_t num_cpu = std::max(folly::hardware_concurrency(), 1u); std::string log_level, input, export_metadata, image_offset; @@ -93,9 +93,11 @@ int dwarfsck_main(int argc, char** argv) { po::variables_map vm; try { - po::store( - po::command_line_parser(argc, argv).options(opts).positional(pos).run(), - vm); + po::store(po::basic_command_line_parser(argc, argv) + .options(opts) + .positional(pos) + .run(), + vm); po::notify(vm); } catch (po::error const& e) { std::cerr << "error: " << e.what() << std::endl; diff --git a/src/dwarfsextract.cpp b/src/dwarfsextract.cpp index 1c066d91..d8bbcc47 100644 --- a/src/dwarfsextract.cpp +++ b/src/dwarfsextract.cpp @@ -22,7 +22,7 @@ #include "dwarfs/error.h" #include "dwarfs_tool_main.h" -int main(int argc, char** argv) { +int SYS_MAIN(int argc, dwarfs::sys_char** argv) { return dwarfs::safe_main( [&] { return dwarfs::dwarfsextract_main(argc, argv); }); } diff --git a/src/dwarfsextract_main.cpp b/src/dwarfsextract_main.cpp index cba5605d..c0c66795 100644 --- a/src/dwarfsextract_main.cpp +++ b/src/dwarfsextract_main.cpp @@ -40,7 +40,7 @@ namespace po = boost::program_options; namespace dwarfs { -int dwarfsextract_main(int argc, char** argv) { +int dwarfsextract_main(int argc, sys_char** argv) { std::string filesystem, output, format, cache_size_str, log_level, image_offset; size_t num_workers; diff --git a/src/mkdwarfs.cpp b/src/mkdwarfs.cpp index eacd65e7..3b7f0115 100644 --- a/src/mkdwarfs.cpp +++ b/src/mkdwarfs.cpp @@ -22,6 +22,6 @@ #include "dwarfs/error.h" #include "dwarfs_tool_main.h" -int main(int argc, char** argv) { +int SYS_MAIN(int argc, dwarfs::sys_char** argv) { return dwarfs::safe_main([&] { return dwarfs::mkdwarfs_main(argc, argv); }); } diff --git a/src/mkdwarfs_main.cpp b/src/mkdwarfs_main.cpp index 9f9b01e1..2c7510e0 100644 --- a/src/mkdwarfs_main.cpp +++ b/src/mkdwarfs_main.cpp @@ -372,7 +372,7 @@ class script_options : public options_interface { } // namespace -int mkdwarfs_main(int argc, char** argv) { +int mkdwarfs_main(int argc, sys_char** argv) { using namespace folly::gen; const size_t num_cpu = std::max(folly::hardware_concurrency(), 1u); @@ -559,8 +559,8 @@ int mkdwarfs_main(int argc, char** argv) { po::collect_unrecognized(parsed.options, po::include_positional); if (!unrecognized.empty()) { - std::cerr << "error: unrecognized argument(s) '" - << boost::join(unrecognized, " ") << "'" << std::endl; + std::wcerr << "error: unrecognized argument(s) '" + << boost::join(unrecognized, " ") << "'" << std::endl; return 1; } } catch (po::error const& e) {