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 dc2a74089da196b2e6255ddad12e45a5198e9717
parent 20708150e7984fdb32d04d08c8b366f1e0eada5b
author Dimitrije Dobrota < mail@dimitrijedobrota.com >
date Tue, 11 Jun 2024 09:46:55 +0200

Code shuffle

Diffstat:
M CMakeLists.txt | + -
M demo/main.c | +++++ ---
M demo/main.cpp | ++++++++ ------
M include/args.h | + -
M include/args.hpp | ++++++++++ ----------
M src/args.cpp | ++++++ -
M src/c_bindings.cpp | +++ ---

7 files changed, 34 insertions(+), 25 deletions(-)


diff --git a/ CMakeLists.txt b/ CMakeLists.txt

@@ -3,7 +3,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)


project(
args
VERSION 0.0.3
VERSION 0.0.4
DESCRIPTION "Command Line Argument Parser"
LANGUAGES CXX C
)

diff --git a/ demo/main.c b/ demo/main.c

@@ -53,13 +53,15 @@ static const args_option_t options[] = {

{ 0, 0, 0, 0, "Informational Options", -1},
{0},
};

static const args_argp_t argp = {
options, parse_opt, "doc string\nother usage",
"First half of the message\vsecond half of the message"
};
// clang-format on

int main(int argc, char *argv[]) {
arguments_t arguments = {0};
args_argp_t argp = {
options, parse_opt, "doc string\nother usage",
"First half of the message\vsecond half of the message"};

if (args_parse(&argp, argc, argv, &arguments)) {
error("There was an error while parsing arguments");

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

@@ -19,7 +19,7 @@ struct arguments_t {

};

int parse_opt(int key, const char *arg, Parser *parser) {
auto arguments = (arguments_t *)parser->input;
auto arguments = (arguments_t *)parser->input();

switch (key) {
case 777: arguments->debug = true; break;

@@ -41,7 +41,7 @@ int parse_opt(int key, const char *arg, Parser *parser) {

}

// clang-format off
static const Parser::option_t options[] = {
static const option_t options[] = {
{ 0, 'R', 0, 0, "random 0-group option"},
{ 0, 0, 0, 0, "Program mode", 1},
{"relocatable", 'r', 0, 0, "Output in relocatable format"},

@@ -55,15 +55,17 @@ static const Parser::option_t options[] = {

{ 0, 0, 0, 0, "Informational Options", -1},
{0},
};

static const argp_t argp = {
options, parse_opt, "doc string\nother usage",
"First half of the message\vsecond half of the message"
};
// clang-format on

int main(int argc, char *argv[]) {
arguments_t arguments;
Parser::argp_t argp = {
options, parse_opt, "doc string\nother usage",
"First half of the message\vsecond half of the message"};

if (Parser::parse(&argp, argc, argv, &arguments)) {
if (parse(&argp, argc, argv, &arguments)) {
error("There was an error while parsing arguments");
return 1;
}

diff --git a/ include/args.h b/ include/args.h

@@ -59,7 +59,7 @@ enum ENUM_KEY {


#if !defined __cplusplus || defined WITH_C_BINDINGS

int args_parse(args_argp_t *argp, int argc, char *argv[], void *input);
int args_parse(const args_argp_t *argp, int argc, char *argv[], void *input);
void *args_parser_input(args_parser *parser);

#endif

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

@@ -9,20 +9,19 @@


namespace args {

class Parser {
public:
using option_t = args_option_t;
using argp_t = args_argp_t;
using option_t = args_option_t;
using argp_t = args_argp_t;

static int parse(argp_t *argp, int argc, char *argv[], void *input) {
Parser parser(input, argp);
return parser.parse(argc, argv, &parser);
}
int parse(const argp_t *argp, int argc, char *argv[], void *input);

void *input;
class Parser {
public:
void *input() const { return m_input; }

private:
Parser(void *input, argp_t *argp);
friend int parse(const argp_t *argp, int argc, char *argv[], void *input);

Parser(const argp_t *argp, void *input);

int parse(int argc, char *argv[], void *input);

@@ -64,6 +63,7 @@ class Parser {

};

const argp_t *argp;
void *m_input;

std::unordered_map<int, const option_t *> options;
std::vector<help_entry_t> help_entries;

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

@@ -9,7 +9,12 @@


namespace args {

Parser::Parser(void *input, argp_t *argp) : input(input), argp(argp) {
int parse(const argp_t *argp, int argc, char *argv[], void *input) {
Parser parser(argp, input);
return parser.parse(argc, argv, &parser);
}

Parser::Parser(const argp_t *argp, void *input) : argp(argp), m_input(input) {
int group = 0, key_last = 0;
bool hidden = false;

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

@@ -3,10 +3,10 @@


namespace args {

int args_parse(args_argp_t *argp, int argc, char *argv[], void *input) {
return Parser::parse(argp, argc, argv, input);
int args_parse(const args_argp_t *argp, int argc, char *argv[], void *input) {
return parse(argp, argc, argv, input);
}

void *args_parser_input(args_parser *parser) { return parser->input; }
void *args_parser_input(args_parser *parser) { return parser->input(); }

} // namespace args