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

commit ce32beb839c8a3fa55f84fd3d37a1be6d2458432
parent 7e8e8f3d66d11bffcfd7c4d99ac84b91fa86cef1
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Wed, 12 Jun 2024 16:55:22 +0200

Improve --help and --usage handling, proper failure

Diffstat:
M src/args.cpp | +++++++++++ -----

1 files changed, 11 insertions(+), 5 deletions(-)


diff --git a/ src/args.cpp b/ src/args.cpp

@@ -29,10 +29,11 @@ void help(const Parser *parser, FILE *stream, unsigned flags) { void failure(const Parser *parser, int status, int errnum, const char *fmt, std::va_list args) {
(void)status;
(void)errnum; std::fprintf(stderr, "%s: ", parser->name()); std::vfprintf(stderr, fmt, args);
std::putc('\n', stderr);
if (status) exit(status);
} void failure(const Parser *parser, int status, int errnum, const char *fmt,

@@ -115,10 +116,12 @@ Parser::Parser(const argp_t *argp, unsigned flags, void *input) } int Parser::parse(int argc, char *argv[]) {
const bool is_help = !(m_flags & NO_HELP);
std::vector<const char *> args; int arg_cnt = 0, err_code = 0, i;
const bool is_help = !(m_flags & NO_HELP);
const bool is_error = !(m_flags & NO_ERRS);
m_name = basename(argv[0]); argp->parse(Key::INIT, 0, this);

@@ -141,7 +144,10 @@ int Parser::parse(int argc, char *argv[]) { for (int j = 0; opt[j]; j++) { const char key = opt[j];
if (is_help && key == '?') help(stderr);
if (is_help && key == '?') {
if (is_error) ::args::help(this, stderr, STD_HELP);
continue;
}
if (!options.count(key)) { err_code = handle_unknown(1, argv[i]);

@@ -174,7 +180,7 @@ int Parser::parse(int argc, char *argv[]) { err_code = handle_excess(argv[i]); goto error; }
help(stderr);
if (is_error) ::args::help(this, stderr, STD_HELP);
continue; }

@@ -183,7 +189,7 @@ int Parser::parse(int argc, char *argv[]) { err_code = handle_excess(argv[i]); goto error; }
usage(stderr);
if (is_error) ::args::help(this, stderr, STD_USAGE);
continue; }