From c5e4811efcdb7f8b40b62acc60676b1187177565 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Fri, 18 Mar 2022 12:18:22 +1000 Subject: [PATCH] cmdopt2/parser: add `usage` overload for FILE* --- cmdopt2/parser.cpp | 44 +++++++++++++++++++++++++++++++++----------- cmdopt2/parser.hpp | 1 + 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/cmdopt2/parser.cpp b/cmdopt2/parser.cpp index b1ac372c..39aedf39 100644 --- a/cmdopt2/parser.cpp +++ b/cmdopt2/parser.cpp @@ -184,29 +184,51 @@ parser::parse (int const argc, const char *const *argv) /////////////////////////////////////////////////////////////////////////////// -void -parser::usage (int argc, char const * const* argv, std::ostream &os) const -{ - os << "Usage:"; +template +static void +usage ( + int argc, + char const * const* argv, + std::vector const &positional, + std::vector const &keyword, + OutputT &output +) { + fmt::print (output, "Usage:"); if (argc > 0) - os << ' ' << argv[0]; + fmt::print (output, " {}", argv[0]); static char constexpr OPTIONAL[2] { '[', ']' }; static char constexpr REQUIRED[2] { '<', '>' }; - for (auto const &arg: m_keyword) { + for (auto const &arg: keyword) { auto const &delimiters = arg.required ? REQUIRED : OPTIONAL; if (arg.short_) - os << ' ' << delimiters[0] << '-' << *arg.short_ << delimiters[1]; + fmt::print (output, " {}-{}{}", delimiters[0], '-', *arg.short_, delimiters[1]); if (arg.long_) - os << ' ' << delimiters[0] << "--" << *arg.long_ << delimiters[1]; + fmt::print (output, " {}--{}{}", delimiters[0], "--", *arg.long_, delimiters[1]); } - for (auto const &arg: m_positional) { + for (auto const &arg: positional) { auto const &delimiters = arg.required ? REQUIRED : OPTIONAL; - os << ' ' << delimiters[0] << arg.name << delimiters[1]; + fmt::print (output, " {}{}{}", delimiters[0], arg.name, delimiters[1]); } - os << '\n'; + fmt::print (output, "\n"); +} + + +//----------------------------------------------------------------------------- +void +parser::usage (int argc, char const * const* argv, std::ostream &os) const +{ + ::usage (argc, argv, m_positional, m_keyword, os); +} + + +//----------------------------------------------------------------------------- +void +parser::usage (int argc, char const * const* argv, FILE *fp) const +{ + ::usage (argc, argv, m_positional, m_keyword, fp); } diff --git a/cmdopt2/parser.hpp b/cmdopt2/parser.hpp index 87ac2090..333b1d10 100644 --- a/cmdopt2/parser.hpp +++ b/cmdopt2/parser.hpp @@ -22,6 +22,7 @@ namespace cruft::cmdopt2 { positional& add (positional const&) &; keyword& add (keyword const&) &; + void usage (int argc, char const * const* argv, FILE*) const; void usage (int argc, char const * const* argv, std::ostream&) const; private: