diff --git a/CMakeLists.txt b/CMakeLists.txt
index f5e422c6..576c1eba 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -683,8 +683,8 @@ list(APPEND LIBDWARFS_EXTRACTOR_SRC
)
list(APPEND LIBDWARFS_TOOL_SRC
- src/dwarfs/tool/call_sys_main_iolayer.cpp
src/dwarfs/tool/iolayer.cpp
+ src/dwarfs/tool/main_adapter.cpp
src/dwarfs/tool/safe_main.cpp
src/dwarfs/tool/sys_char.cpp
src/dwarfs/tool/tool.cpp
diff --git a/include/dwarfs/tool/call_sys_main_iolayer.h b/include/dwarfs/tool/call_sys_main_iolayer.h
deleted file mode 100644
index 7d2d31f4..00000000
--- a/include/dwarfs/tool/call_sys_main_iolayer.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* vim:set ts=2 sw=2 sts=2 et: */
-/**
- * \author Marcus Holland-Moritz (github@mhxnet.de)
- * \copyright Copyright (c) Marcus Holland-Moritz
- *
- * This file is part of dwarfs.
- *
- * dwarfs is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * dwarfs is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with dwarfs. If not, see .
- */
-
-#pragma once
-
-#include
-
-#include
-
-namespace dwarfs::tool {
-
-struct iolayer;
-
-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&));
-
-} // namespace dwarfs::tool
diff --git a/include/dwarfs/tool/tool_fwd.h b/include/dwarfs/tool/main_adapter.h
similarity index 60%
rename from include/dwarfs/tool/tool_fwd.h
rename to include/dwarfs/tool/main_adapter.h
index c098a8c2..72ee7f75 100644
--- a/include/dwarfs/tool/tool_fwd.h
+++ b/include/dwarfs/tool/main_adapter.h
@@ -21,24 +21,33 @@
#pragma once
-#include
#include
#include
#include
#include
-#include
namespace dwarfs::tool {
struct iolayer;
-}
+class main_adapter {
+ public:
+ using main_fn_type = int (*)(int, sys_char**, iolayer const&);
-#define DWARFS_TOOL_MAIN_DECL(tool_name) \
- namespace dwarfs::tool { \
- int tool_name##_main(std::span args, iolayer const& iol); \
- int tool_name##_main(std::span args, iolayer const& iol); \
- int tool_name##_main(int argc, sys_char** argv, iolayer const& iol); \
- int tool_name##_main(int argc, sys_char** argv); \
- }
+ explicit main_adapter(main_fn_type main_fn)
+ : main_fn_(main_fn) {}
+
+ int operator()(int argc, sys_char** argv) const;
+ int operator()(std::span args, iolayer const& iol) const;
+ int operator()(std::span args, iolayer const& iol) const;
+
+ int safe(int argc, sys_char** argv) const;
+ int safe(std::span args, iolayer const& iol) const;
+ int safe(std::span args, iolayer const& iol) const;
+
+ private:
+ main_fn_type main_fn_{nullptr};
+};
+
+} // namespace dwarfs::tool
diff --git a/include/dwarfs/tool/tool.h b/include/dwarfs/tool/tool.h
index 2ddec7ec..84faa53a 100644
--- a/include/dwarfs/tool/tool.h
+++ b/include/dwarfs/tool/tool.h
@@ -26,8 +26,6 @@
#include
-#include
-
#ifdef DWARFS_BUILTIN_MANPAGE
#include
#endif
diff --git a/include/dwarfs_tool_main.h b/include/dwarfs_tool_main.h
index 8ba8d4fc..59c6f802 100644
--- a/include/dwarfs_tool_main.h
+++ b/include/dwarfs_tool_main.h
@@ -21,10 +21,16 @@
#pragma once
-#include
+#include
-DWARFS_TOOL_MAIN_DECL(mkdwarfs)
-DWARFS_TOOL_MAIN_DECL(dwarfsck)
-DWARFS_TOOL_MAIN_DECL(dwarfsextract)
-DWARFS_TOOL_MAIN_DECL(dwarfsbench)
-DWARFS_TOOL_MAIN_DECL(dwarfs)
+namespace dwarfs::tool {
+
+struct iolayer;
+
+int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol);
+int dwarfsck_main(int argc, sys_char** argv, iolayer const& iol);
+int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol);
+int dwarfsbench_main(int argc, sys_char** argv, iolayer const& iol);
+int dwarfs_main(int argc, sys_char** argv, iolayer const& iol);
+
+} // namespace dwarfs::tool
diff --git a/src/dwarfs.cpp b/src/dwarfs.cpp
index ca84ec6f..d5807d95 100644
--- a/src/dwarfs.cpp
+++ b/src/dwarfs.cpp
@@ -19,10 +19,11 @@
* along with dwarfs. If not, see .
*/
-#include
+#include
#include
-int SYS_MAIN(int argc, dwarfs::tool::sys_char** argv) {
- return dwarfs::tool::safe_main(
- [&] { return dwarfs::tool::dwarfs_main(argc, argv); });
+using namespace dwarfs::tool;
+
+int SYS_MAIN(int argc, sys_char** argv) {
+ return main_adapter(dwarfs_main).safe(argc, argv);
}
diff --git a/src/dwarfs/tool/call_sys_main_iolayer.cpp b/src/dwarfs/tool/main_adapter.cpp
similarity index 50%
rename from src/dwarfs/tool/call_sys_main_iolayer.cpp
rename to src/dwarfs/tool/main_adapter.cpp
index 098fd64e..3301059c 100644
--- a/src/dwarfs/tool/call_sys_main_iolayer.cpp
+++ b/src/dwarfs/tool/main_adapter.cpp
@@ -21,17 +21,17 @@
#include
-#include
-
-extern "C" int dwarfs_wcwidth(int ucs);
+#include
+#include
+#include
namespace dwarfs::tool {
namespace {
template
-int call_sys_main_iolayer_impl(std::span args, iolayer const& iol,
- int (*main)(int, sys_char**, iolayer const&)) {
+int call_sys_main_iolayer(std::span args, iolayer const& iol,
+ main_adapter::main_fn_type main_fn) {
std::vector argv;
std::vector argv_ptrs;
argv.reserve(args.size());
@@ -40,19 +40,36 @@ int call_sys_main_iolayer_impl(std::span args, iolayer const& iol,
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);
+ return main_fn(argv_ptrs.size(), argv_ptrs.data(), iol);
}
} // namespace
-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);
+int main_adapter::operator()(int argc, sys_char** argv) const {
+ return main_fn_(argc, argv, iolayer::system_default());
}
-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);
+int main_adapter::operator()(std::span args,
+ iolayer const& iol) const {
+ return call_sys_main_iolayer(args, iol, main_fn_);
+}
+
+int main_adapter::operator()(std::span args,
+ iolayer const& iol) const {
+ return call_sys_main_iolayer(args, iol, main_fn_);
+}
+
+int main_adapter::safe(int argc, sys_char** argv) const {
+ return safe_main([&] { return (*this)(argc, argv); });
+}
+
+int main_adapter::safe(std::span args, iolayer const& iol) const {
+ return safe_main([&] { return (*this)(args, iol); });
+}
+
+int main_adapter::safe(std::span args,
+ iolayer const& iol) const {
+ return safe_main([&] { return (*this)(args, iol); });
}
} // namespace dwarfs::tool
diff --git a/src/dwarfs_main.cpp b/src/dwarfs_main.cpp
index 5565661d..d212f1bc 100644
--- a/src/dwarfs_main.cpp
+++ b/src/dwarfs_main.cpp
@@ -96,7 +96,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -1653,16 +1652,4 @@ int dwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
#endif
}
-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);
-}
-
-int dwarfs_main(std::span args, iolayer const& iol) {
- return call_sys_main_iolayer(args, iol, dwarfs_main);
-}
-
} // namespace dwarfs::tool
diff --git a/src/dwarfsbench.cpp b/src/dwarfsbench.cpp
index a3cfe174..b7e25494 100644
--- a/src/dwarfsbench.cpp
+++ b/src/dwarfsbench.cpp
@@ -19,10 +19,11 @@
* along with dwarfs. If not, see .
*/
-#include
+#include
#include
-int SYS_MAIN(int argc, dwarfs::tool::sys_char** argv) {
- return dwarfs::tool::safe_main(
- [&] { return dwarfs::tool::dwarfsbench_main(argc, argv); });
+using namespace dwarfs::tool;
+
+int SYS_MAIN(int argc, sys_char** argv) {
+ return main_adapter(dwarfsbench_main).safe(argc, argv);
}
diff --git a/src/dwarfsbench_main.cpp b/src/dwarfsbench_main.cpp
index 1d7677d7..0335475f 100644
--- a/src/dwarfsbench_main.cpp
+++ b/src/dwarfsbench_main.cpp
@@ -32,7 +32,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -134,16 +133,4 @@ int dwarfsbench_main(int argc, sys_char** argv, iolayer const& iol) {
return 0;
}
-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);
-}
-
-int dwarfsbench_main(std::span args, iolayer const& iol) {
- return call_sys_main_iolayer(args, iol, dwarfsbench_main);
-}
-
} // namespace dwarfs::tool
diff --git a/src/dwarfsck.cpp b/src/dwarfsck.cpp
index 03cf4a55..3109e0cf 100644
--- a/src/dwarfsck.cpp
+++ b/src/dwarfsck.cpp
@@ -19,10 +19,11 @@
* along with dwarfs. If not, see .
*/
-#include
+#include
#include
-int SYS_MAIN(int argc, dwarfs::tool::sys_char** argv) {
- return dwarfs::tool::safe_main(
- [&] { return dwarfs::tool::dwarfsck_main(argc, argv); });
+using namespace dwarfs::tool;
+
+int SYS_MAIN(int argc, sys_char** argv) {
+ return main_adapter(dwarfsck_main).safe(argc, argv);
}
diff --git a/src/dwarfsck_main.cpp b/src/dwarfsck_main.cpp
index 3b7b566f..284a0260 100644
--- a/src/dwarfsck_main.cpp
+++ b/src/dwarfsck_main.cpp
@@ -45,7 +45,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -365,16 +364,4 @@ int dwarfsck_main(int argc, sys_char** argv, iolayer const& iol) {
return 0;
}
-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);
-}
-
-int dwarfsck_main(std::span args, iolayer const& iol) {
- return call_sys_main_iolayer(args, iol, dwarfsck_main);
-}
-
} // namespace dwarfs::tool
diff --git a/src/dwarfsextract.cpp b/src/dwarfsextract.cpp
index ce40317e..a202b7da 100644
--- a/src/dwarfsextract.cpp
+++ b/src/dwarfsextract.cpp
@@ -19,10 +19,11 @@
* along with dwarfs. If not, see .
*/
-#include
+#include
#include
-int SYS_MAIN(int argc, dwarfs::tool::sys_char** argv) {
- return dwarfs::tool::safe_main(
- [&] { return dwarfs::tool::dwarfsextract_main(argc, argv); });
+using namespace dwarfs::tool;
+
+int SYS_MAIN(int argc, sys_char** argv) {
+ return main_adapter(dwarfsextract_main).safe(argc, argv);
}
diff --git a/src/dwarfsextract_main.cpp b/src/dwarfsextract_main.cpp
index 4112d0ca..a4067eb7 100644
--- a/src/dwarfsextract_main.cpp
+++ b/src/dwarfsextract_main.cpp
@@ -35,7 +35,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -230,16 +229,4 @@ int dwarfsextract_main(int argc, sys_char** argv, iolayer const& iol) {
return rv;
}
-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);
-}
-
-int dwarfsextract_main(std::span args, iolayer const& iol) {
- return call_sys_main_iolayer(args, iol, dwarfsextract_main);
-}
-
} // namespace dwarfs::tool
diff --git a/src/mkdwarfs.cpp b/src/mkdwarfs.cpp
index b42640d8..5f31cd76 100644
--- a/src/mkdwarfs.cpp
+++ b/src/mkdwarfs.cpp
@@ -19,10 +19,11 @@
* along with dwarfs. If not, see .
*/
-#include
+#include
#include
-int SYS_MAIN(int argc, dwarfs::tool::sys_char** argv) {
- return dwarfs::tool::safe_main(
- [&] { return dwarfs::tool::mkdwarfs_main(argc, argv); });
+using namespace dwarfs::tool;
+
+int SYS_MAIN(int argc, sys_char** argv) {
+ return main_adapter(mkdwarfs_main).safe(argc, argv);
}
diff --git a/src/mkdwarfs_main.cpp b/src/mkdwarfs_main.cpp
index aed0bcf2..d92c45fc 100644
--- a/src/mkdwarfs_main.cpp
+++ b/src/mkdwarfs_main.cpp
@@ -82,7 +82,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -1403,16 +1402,4 @@ int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
return errors > 0 ? 2 : 0;
}
-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);
-}
-
-int mkdwarfs_main(std::span args, iolayer const& iol) {
- return call_sys_main_iolayer(args, iol, mkdwarfs_main);
-}
-
} // namespace dwarfs::tool
diff --git a/src/universal.cpp b/src/universal.cpp
index 42084d49..4540bb0e 100644
--- a/src/universal.cpp
+++ b/src/universal.cpp
@@ -34,7 +34,7 @@
#include
#include
-#include
+#include
#include
#include
@@ -48,12 +48,12 @@ using namespace dwarfs::tool;
#define EXE_EXT ""
#endif
-std::map const functions{
- {"dwarfs", &dwarfs_main},
- {"mkdwarfs", &mkdwarfs_main},
- {"dwarfsck", &dwarfsck_main},
- {"dwarfsextract", &dwarfsextract_main},
- // {"dwarfsbench", &dwarfsbench_main},
+std::map const functions{
+ {"dwarfs", dwarfs_main},
+ {"mkdwarfs", mkdwarfs_main},
+ {"dwarfsck", dwarfsck_main},
+ {"dwarfsextract", dwarfsextract_main},
+ // {"dwarfsbench", dwarfsbench_main},
};
} // namespace
@@ -66,7 +66,7 @@ int SYS_MAIN(int argc, sys_char** argv) {
if (auto ext = path.extension().string(); ext.empty() || ext == EXE_EXT) {
auto stem = path.stem().string();
if (auto it = functions.find(stem); it != functions.end()) {
- return safe_main([&] { return it->second(argc, argv); });
+ return main_adapter(it->second).safe(argc, argv);
}
// see if the stem has an appended version and try removing that
@@ -77,7 +77,7 @@ int SYS_MAIN(int argc, sys_char** argv) {
it != functions.end()) {
std::cerr << "running " << stem << " as " << stem.substr(0, pos)
<< "\n";
- return safe_main([&] { return it->second(argc, argv); });
+ return main_adapter(it->second).safe(argc, argv);
}
}
}
@@ -92,8 +92,7 @@ int SYS_MAIN(int argc, sys_char** argv) {
argv_copy.reserve(argc - 1);
argv_copy.emplace_back(argv[0]);
std::copy(argv + 2, argv + argc, std::back_inserter(argv_copy));
- return safe_main(
- [&] { return it->second(argc - 1, argv_copy.data()); });
+ return main_adapter(it->second).safe(argc - 1, argv_copy.data());
}
}
}
diff --git a/test/block_cache_test.cpp b/test/block_cache_test.cpp
index d107e3f5..ac3c9240 100644
--- a/test/block_cache_test.cpp
+++ b/test/block_cache_test.cpp
@@ -35,6 +35,7 @@
#include
#include
#include
+#include
#include
#include
@@ -173,7 +174,7 @@ TEST_P(options_test, cache_stress) {
std::vector args{"mkdwarfs", "-i", "/", "-o", "-",
"-l3", "-S16", "-C", compression};
- EXPECT_EQ(0, mkdwarfs_main(args, iol.get()));
+ EXPECT_EQ(0, tool::main_adapter(tool::mkdwarfs_main)(args, iol.get()));
mm = std::make_shared(iol.out());
}
diff --git a/test/tool_main_test.cpp b/test/tool_main_test.cpp
index 73dea123..0a85c7d8 100644
--- a/test/tool_main_test.cpp
+++ b/test/tool_main_test.cpp
@@ -45,6 +45,7 @@
#include
#include
#include
+#include
#include
#include
@@ -119,7 +120,7 @@ class tool_main_test : public testing::Test {
class tester_common {
public:
- using main_ptr_t = int (*)(std::span, iolayer const&);
+ using main_ptr_t = tool::main_adapter::main_fn_type;
tester_common(main_ptr_t mp, std::string toolname,
std::shared_ptr pos)
@@ -133,7 +134,7 @@ class tester_common {
int run(std::vector args) {
args.insert(args.begin(), toolname_);
- return main_(args, iol->get());
+ return tool::main_adapter(main_)(args, iol->get());
}
int run(std::initializer_list args) {
@@ -409,7 +410,7 @@ class mkdwarfs_main_test : public tool_main_test {
public:
int run(std::vector args) {
args.insert(args.begin(), "mkdwarfs");
- return mkdwarfs_main(args, iol->get());
+ return tool::main_adapter(tool::mkdwarfs_main)(args, iol->get());
}
};
@@ -417,7 +418,7 @@ class dwarfsck_main_test : public tool_main_test {
public:
int run(std::vector args) {
args.insert(args.begin(), "dwarfsck");
- return dwarfsck_main(args, iol->get());
+ return tool::main_adapter(tool::dwarfsck_main)(args, iol->get());
}
};
@@ -425,7 +426,7 @@ class dwarfsextract_main_test : public tool_main_test {
public:
int run(std::vector args) {
args.insert(args.begin(), "dwarfsextract");
- return dwarfsextract_main(args, iol->get());
+ return tool::main_adapter(tool::dwarfsextract_main)(args, iol->get());
}
};