poafloc

Parser Of Arguments For Lines Of Commands
git clone git://git.dimitrijedobrota.com/poafloc.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |

commitd5dd6c25d71bb1a777ff99b2a6903b880eb713a0
parentf43244f45b0a1d518bafd73e85555c25bacb02a0
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateSat, 8 Jun 2024 19:10:01 +0200

Streamline --usage using existing help_entries * More concise code without redundancies * Exclude hidden * Better sorting

Diffstat:
Margs.hpp|+++++++++++++++++++++++------------------------------

1 files changed, 23 insertions(+), 30 deletions(-)


diff --git a/args.hpp b/args.hpp

@@ -393,51 +393,44 @@ class Parser {

std::string message = std::format("Usage: {}", name);
message += " [-";
for (int i = 0; true; i++) {
const auto &opt = argp->options[i];
if (!opt.name && !opt.key) break;
if (!std::isprint(opt.key)) continue;
if (opt.arg) continue;
message += (char)opt.key;
for (const auto &entry : help_entries) {
if (entry.arg()) continue;
for (const char c : entry.opt_short()) {
message += c;
}
}
message += "?]";
message += "]";
std::cout << message;
count = size(message);
for (int i = 0; true; i++) {
const auto &opt = argp->options[i];
if (!opt.name && !opt.key) break;
if (!std::isprint(opt.key)) continue;
if (!opt.arg) continue;
if (opt.options & Option::ARG_OPTIONAL) {
print(std::format(" [-{}[{}]]", (char)opt.key, opt.arg));
} else {
print(std::format(" [-{} {}]", (char)opt.key, opt.arg));
for (const auto &entry : help_entries) {
if (!entry.arg()) continue;
for (const char c : entry.opt_short()) {
if (entry.opt()) {
print(std::format(" [-{}[{}]]", c, entry.arg()));
} else {
print(std::format(" [-{} {}]", c, entry.arg()));
}
}
}
for (int i = 0; true; i++) {
const auto &opt = argp->options[i];
if (!opt.name && !opt.key) break;
if (!opt.name) continue;
for (const auto &entry : help_entries) {
for (const char *name : entry.opt_long()) {
if (!entry.arg()) {
print(std::format(" [--{}]", name));
continue;
}
if (!opt.arg) print(std::format(" [--{}]", opt.name));
else {
if (opt.options & Option::ARG_OPTIONAL) {
print(std::format(" [--{}[={}]]", opt.name, opt.arg));
if (entry.opt()) {
print(std::format(" [--{}[={}]]", name, entry.arg()));
} else {
print(std::format(" [--{}={}]", opt.name, opt.arg));
print(std::format(" [--{}={}]", name, entry.arg()));
}
}
}
print(" [--help]");
print(" [--usage] ");
if (argp->doc) print(argp->doc);
std::cout << std::endl;
exit(0);