poaflocParser 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 | 394aa9e76ad447d967bf40ddef9eecd1fef06735 |
parent | a23c8139cf1ef9d4141701edc0385ab26b07cebd |
author | Dimitrije Dobrota <mail@dimitrijedobrota.com> |
date | Thu, 6 Jun 2024 12:25:22 +0200 |
Options with optional arguments * Long options with optional argument require '=' * Short options with optional argument cannot be ganged together
Diffstat:M | args.hpp | | | ++++++++++++++++--------- |
M | demo.cpp | | | ++++++++------ |
2 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/args.hpp b/args.hpp
@@ -13,6 +13,13 @@ class Parser {
const char *name;
const char key;
const char *arg;
const uint8_t options;
};
enum Option {
ARG_OPTIONAL = 0x1,
HIDDEN = 0x2,
ALIAS = 0x3,
};
struct argp_t {
@@ -58,11 +65,10 @@ class Parser {
const char *arg = nullptr;
if (option->arg) {
if (opt[j + 1] == 0) {
if (opt[j + 1] != 0) arg = opt + j + 1;
else if ((option->options & ARG_OPTIONAL) == 0) {
if (i == argc) goto missing;
arg = argv[++i];
} else {
arg = opt + j + 1;
}
}
@@ -82,12 +88,13 @@ class Parser {
const auto *option = options[key - 'a'];
const char *arg = nullptr;
if (eq) {
if (!option->arg) goto excess;
arg = eq + 1;
} else if (option->arg) {
if (i == argc) goto missing;
arg = argv[++i];
if (!option->arg && eq) goto excess;
if (option->arg) {
if (eq) arg = eq + 1;
else if ((option->options & ARG_OPTIONAL) == 0) {
if (i == argc) goto missing;
arg = argv[++i];
}
}
argp->parser(key, arg, input);
diff --git a/demo.cpp b/demo.cpp
@@ -29,7 +29,7 @@ int parse_opt(int key, const char *arg, void *input) {
if (arguments->hex) error("cannot mix -hex and -relocatable");
arguments->relocatable = true;
break;
case 'o': arguments->output_file = arg; break;
case 'o': arguments->output_file = arg ? arg : "stdout"; break;
case 'i': arguments->input_file = arg; break;
default: arguments->args.push_back(arg);
}
@@ -37,13 +37,15 @@ int parse_opt(int key, const char *arg, void *input) {
return 0;
}
using enum Parser::Option;
// clang-format off
static const Parser::option_t options[] = {
{ 0, 'o', "file"},
{ "input", 'i', "file"},
{ "debug", 'd', 0},
{ "hex", 'h', 0},
{"relocatable", 'r', 0},
{ "output", 'o', "file", ARG_OPTIONAL},
{ 0, 'i', "file", 0},
{ "debug", 'd', 0, 0},
{ "hex", 'h', 0, 0},
{"relocatable", 'r', 0, 0},
{0},
};
// clang-format on