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 |

commit2e53ace02f887ce07e78f834fab29588c1dd648c
parent31224a1328bc4bb1f93fe7735ce5204621e199fa
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateThu, 6 Jun 2024 14:56:57 +0200

Add proper keys for all kinds of events

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

2 files changed, 26 insertions(+), 4 deletions(-)


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

@@ -23,6 +23,15 @@ class Parser {

ALIAS = 0x3,
};
enum Key {
ARG = 0,
END = 0x1000001,
NO_ARGS = 0x1000002,
INIT = 0x1000003,
SUCCESS = 0x1000004,
ERROR = 0x1000005,
};
struct argp_t {
using parse_f = int (*)(int key, const char *arg, void *input);

@@ -70,11 +79,14 @@ class Parser {

}
int parse(int argc, char *argv[], void *input) {
int i;
int args = 0, i;
argp->parser(Key::INIT, 0, input);
for (i = 1; i < argc; i++) {
if (argv[i][0] != '-') {
argp->parser(-1, argv[i], input);
argp->parser(Key::ARG, argv[i], input);
args++;
continue;
}

@@ -127,21 +139,30 @@ class Parser {

}
for (i = i + 1; i < argc; i++) {
argp->parser(-1, argv[i], input);
argp->parser(Key::ARG, argv[i], input);
args++;
}
if (!args) argp->parser(Key::NO_ARGS, 0, input);
argp->parser(Key::END, 0, input);
argp->parser(Key::SUCCESS, 0, input);
return 0;
unknown:
std::cerr << std::format("unknown option {}\n", argv[i]);
argp->parser(Key::ERROR, 0, input);
return 1;
missing:
std::cerr << std::format("option {} missing a value\n", argv[i]);
argp->parser(Key::ERROR, 0, input);
return 2;
excess:
std::cerr << std::format("option {} don't require a value\n", argv[i]);
argp->parser(Key::ERROR, 0, input);
return 3;
}

diff --git a/demo.cpp b/demo.cpp

@@ -31,7 +31,8 @@ int parse_opt(int key, const char *arg, void *input) {

break;
case 'o': arguments->output_file = arg ? arg : "stdout"; break;
case 'i': arguments->input_file = arg; break;
default: arguments->args.push_back(arg);
case Parser::Key::ARG: arguments->args.push_back(arg); break;
case Parser::Key::ERROR: std::cerr << "handled error\n";
}
return 0;