diff options
Diffstat (limited to 'src/args.cc')
| -rw-r--r-- | src/args.cc | 93 |
1 files changed, 50 insertions, 43 deletions
diff --git a/src/args.cc b/src/args.cc index 078db1a..1794941 100644 --- a/src/args.cc +++ b/src/args.cc @@ -26,10 +26,13 @@ class OptionImpl : public Args::OptionArgument { OptionalArgument, }; - OptionImpl(Type type, char shortname, std::string longname, - std::string arg, std::string help) - : type(type), shortname(shortname), longname(std::move(longname)), - arg(std::move(arg)), help(std::move(help)) {} + OptionImpl(Type type, char shortname, std::string longname, std::string arg, + std::string help) + : type(type), + shortname(shortname), + longname(std::move(longname)), + arg(std::move(arg)), + help(std::move(help)) {} const Type type; const char shortname; @@ -57,13 +60,13 @@ class OptionImpl : public Args::OptionArgument { void set_argument(std::string value) { assert(type == Type::RequiredArgument || type == Type::OptionalArgument); - is_set_= true; + is_set_ = true; value_ = std::move(value); } void set_no_argument() { assert(type == Type::NoArgument || type == Type::OptionalArgument); - is_set_= true; + is_set_ = true; value_.reset(); } @@ -74,11 +77,10 @@ class OptionImpl : public Args::OptionArgument { class ArgsImpl : public Args { public: - explicit ArgsImpl(std::string prgname) - : prgname_(std::move(prgname)) {} + explicit ArgsImpl(std::string prgname) : prgname_(std::move(prgname)) {} - std::shared_ptr<Option> option( - char shortname, std::string longname, std::string help) override { + std::shared_ptr<Option> option(char shortname, std::string longname, + std::string help) override { auto opt = std::make_shared<OptionImpl>( OptionImpl::Type::NoArgument, shortname, std::move(longname), /* arg */ std::string(), std::move(help)); @@ -86,13 +88,15 @@ class ArgsImpl : public Args { return opt; } - std::shared_ptr<OptionArgument> option_argument( - char shortname, std::string longname, std::string arg, - std::string help, bool required) override { + std::shared_ptr<OptionArgument> option_argument(char shortname, + std::string longname, + std::string arg, + std::string help, + bool required) override { auto opt = std::make_shared<OptionImpl>( - required ? OptionImpl::Type::RequiredArgument : - OptionImpl::Type::OptionalArgument, shortname, std::move(longname), - std::move(arg), std::move(help)); + required ? OptionImpl::Type::RequiredArgument + : OptionImpl::Type::OptionalArgument, + shortname, std::move(longname), std::move(arg), std::move(help)); add(opt); return opt; } @@ -118,9 +122,11 @@ class ArgsImpl : public Args { if (argv[a][1] == '-') { // long option size_t eq = 2; - while (argv[a][eq] != '=' && argv[a][eq] != '\0') ++eq; + while (argv[a][eq] != '=' && argv[a][eq] != '\0') + ++eq; size_t end = eq; - while (argv[a][end] != '\0') ++end; + while (argv[a][end] != '\0') + ++end; if (end == 2) { // "--", no more options signal @@ -134,8 +140,8 @@ class ArgsImpl : public Args { auto name = std::string_view(argv[a] + 2, eq - 2); auto it = long_.find(name); if (it == long_.end()) { - last_error_ = std::format("{}: unrecognized option '--{}'", - prgname, name); + last_error_ = + std::format("{}: unrecognized option '--{}'", prgname, name); return false; } auto& opt = options_[it->second]; @@ -144,9 +150,9 @@ class ArgsImpl : public Args { // long option with argument after equal sign switch (opt->type) { case OptionImpl::Type::NoArgument: - last_error_ = std::format( - "{}: option '--{}' doesn't allow an argument", - prgname, name); + last_error_ = + std::format("{}: option '--{}' doesn't allow an argument", + prgname, name); return false; case OptionImpl::Type::RequiredArgument: case OptionImpl::Type::OptionalArgument: @@ -163,8 +169,7 @@ class ArgsImpl : public Args { case OptionImpl::Type::RequiredArgument: if (++a >= argc) { last_error_ = std::format( - "{}: option '--{}' requires an argument", - prgname, name); + "{}: option '--{}' requires an argument", prgname, name); return false; } opt->set_argument(argv[a]); @@ -177,8 +182,8 @@ class ArgsImpl : public Args { for (; *current; ++current) { auto it = short_.find(*current); if (it == short_.end()) { - last_error_ = std::format("{}: invalid option -- '{}'", - prgname, *current); + last_error_ = + std::format("{}: invalid option -- '{}'", prgname, *current); return false; } @@ -190,9 +195,9 @@ class ArgsImpl : public Args { break; case OptionImpl::Type::RequiredArgument: if (++a >= argc) { - last_error_ = std::format( - "{}: option requires an argument -- '{}'", - prgname, *current); + last_error_ = + std::format("{}: option requires an argument -- '{}'", + prgname, *current); return false; } opt->set_argument(argv[a]); @@ -209,13 +214,15 @@ class ArgsImpl : public Args { } void print_error(std::ostream& out) const override { - if (last_error_.empty()) return; + if (last_error_.empty()) + return; out << last_error_ << '\n'; } void print_help(std::ostream& out, uint32_t width = 79) const override { - if (options_.empty()) return; + if (options_.empty()) + return; uint32_t indent = 0; const uint32_t max_need = width / 2; @@ -223,7 +230,7 @@ class ArgsImpl : public Args { for (auto const& opt : options_) { uint32_t need; if (opt->longname.empty()) { - need = 4; // -O + need = 4; // -O switch (opt->type) { case OptionImpl::Type::NoArgument: case OptionImpl::Type::OptionalArgument: @@ -233,7 +240,7 @@ class ArgsImpl : public Args { break; } } else { - need = 8 + opt->longname.size(); // -O, --option + need = 8 + opt->longname.size(); // -O, --option switch (opt->type) { case OptionImpl::Type::NoArgument: break; @@ -247,7 +254,7 @@ class ArgsImpl : public Args { break; } } - need += 2; // margin + need += 2; // margin option_need.emplace_back(need); if (need <= max_need) { @@ -255,7 +262,8 @@ class ArgsImpl : public Args { } } - print_wrap(out, width, /* indent */ 0, "Mandatory arguments to long options" + print_wrap(out, width, /* indent */ 0, + "Mandatory arguments to long options" " are mandatory for short options too."); auto need_it = option_need.begin(); for (auto const& opt : options_) { @@ -321,12 +329,10 @@ class ArgsImpl : public Args { options_.emplace_back(std::move(opt)); } - static inline bool is_whitespace(char c) { - return c == ' ' || c == '\t'; - } + static inline bool is_whitespace(char c) { return c == ' ' || c == '\t'; } static void print_wrap(std::ostream& out, uint32_t width, uint32_t indent, - const std::string& str) { + const std::string& str) { if (indent + str.size() <= width) { out << str << '\n'; return; @@ -341,7 +347,8 @@ class ArgsImpl : public Args { size_t offset = 0; while (offset + avail < str.size()) { uint32_t i = avail; - while (i > 0 && !is_whitespace(str[offset + i])) --i; + while (i > 0 && !is_whitespace(str[offset + i])) + --i; if (i == 0) { out << str.substr(offset, avail - 1); out << "-\n"; @@ -366,8 +373,8 @@ class ArgsImpl : public Args { } // namespace -std::shared_ptr<Args::Option> Args::option( - std::string longname, std::string help) { +std::shared_ptr<Args::Option> Args::option(std::string longname, + std::string help) { return option(/* shortname */ '\0', std::move(longname), std::move(help)); } |
