/* 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 .
*/
#include
#include
#include
#include
#include
#include
#include
namespace dwarfs::tool {
namespace {
namespace bp = boost::process;
std::vector const pagers{
{"less", {"-R"}},
};
} // namespace
#ifdef _WIN32
#define X_OK 0
#endif
std::optional find_pager_program(os_access const& os) {
if (auto pager_env = os.getenv("PAGER")) {
std::string_view sv{pager_env.value()};
if (sv == "cat") {
return std::nullopt;
}
if (sv.starts_with('"') && sv.ends_with('"')) {
sv.remove_prefix(1);
sv.remove_suffix(1);
}
std::filesystem::path p{std::string(sv)};
if (os.access(p, X_OK) == 0) {
return pager_program{p, {}};
}
if (auto exe = os.find_executable(p); !exe.empty()) {
return pager_program{exe, {}};
}
}
for (auto const& p : pagers) {
if (auto exe = os.find_executable(p.name); !exe.empty()) {
return pager_program{exe, p.args};
}
}
return std::nullopt;
}
void show_in_pager(pager_program const& pager, std::string text) {
boost::asio::io_service ios;
bp::child proc(pager.name.wstring(), bp::args(pager.args),
bp::std_in =
boost::asio::const_buffer(text.data(), text.size()),
bp::std_out > stdout, ios);
ios.run();
proc.wait();
}
} // namespace dwarfs::tool