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 6742bf3cc7de1fc167e7ee1036188ee7090fcfa1
parent 7e17af6fb29d98f538cab80db0fdbef1bd170929
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Mon, 10 Jun 2024 22:48:30 +0200

Fix ugly enums using prepprocessor magic

Diffstat:
M demo/main.cpp | ++ ----
M include/args.h | ++++++++++++++++++++++++ ------------
M include/args.hpp | ---------------

3 files changed, 26 insertions(+), 31 deletions(-)


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

@@ -33,15 +33,13 @@ int parse_opt(int key, const char *arg, Parser *parser) { break; case 'o': arguments->output_file = arg ? arg : "stdout"; break; case 'i': arguments->input_file = arg; break;
case Parser::Key::ARG: arguments->args.push_back(arg); break;
case Parser::Key::ERROR: std::cerr << "handled error\n";
case Key::ARG: arguments->args.push_back(arg); break;
case Key::ERROR: std::cerr << "handled error\n";
} return 0; }
using enum Parser::Option;
// clang-format off static const Parser::option_t options[] = { { 0, 'R', 0, 0, "random 0-group option"},

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

@@ -3,13 +3,22 @@ #ifdef __cplusplus
#define MANGLE_ENUM(enumn, name) name
#define ENUM_OPTION Option
#define ENUM_KEY Key
extern "C" { namespace args {
struct Parser; typedef Parser args_parser; #else
#define MANGLE_ENUM(enumn, name) ARGS_##enumn##_##name
#define ENUM_OPTION args_option_e
#define ENUM_KEY args_key_e
struct __Parser; typedef struct __Parser args_parser;

@@ -33,22 +42,21 @@ typedef struct { const char *message; } args_argp_t;
enum args_option_e {
ARGS_OPTION_ARG_OPTIONAL = 0x1,
ARGS_OPTION_HIDDEN = 0x2,
ARGS_OPTION_ALIAS = 0x4,
enum ENUM_OPTION {
MANGLE_ENUM(OPTION, ARG_OPTIONAL) = 0x1,
MANGLE_ENUM(OPTION, HIDDEN) = 0x2,
MANGLE_ENUM(OPTION, ALIAS) = 0x4,
};
enum args_key_e {
ARGS_KEY_ARG = 0,
ARGS_KEY_END = 0x1000001,
ARGS_KEY_NO_ARGS = 0x1000002,
ARGS_KEY_INIT = 0x1000003,
ARGS_KEY_SUCCESS = 0x1000004,
ARGS_KEY_ERROR = 0x1000005,
enum ENUM_KEY {
MANGLE_ENUM(KEY, ARG) = 0,
MANGLE_ENUM(KEY, END) = 0x1000001,
MANGLE_ENUM(KEY, NO_ARGS) = 0x1000002,
MANGLE_ENUM(KEY, INIT) = 0x1000003,
MANGLE_ENUM(KEY, SUCCESS) = 0x1000004,
MANGLE_ENUM(KEY, ERROR) = 0x1000005,
};
#if !defined __cplusplus || defined WITH_C_BINDINGS int args_parse(args_argp_t *argp, int argc, char *argv[], void *input);

@@ -56,6 +64,10 @@ void *args_parser_input(args_parser *parser); #endif
#undef MANGLE_ENUM
#undef ENUM_OPTION
#undef ENUM_KEY
#ifdef __cplusplus } // namespace args } // extern "C"

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

@@ -14,21 +14,6 @@ class Parser { using option_t = args_option_t; using argp_t = args_argp_t;
enum Option {
ARG_OPTIONAL = ARGS_OPTION_ARG_OPTIONAL,
HIDDEN = ARGS_OPTION_HIDDEN,
ALIAS = ARGS_OPTION_ALIAS,
};
enum Key {
ARG = ARGS_KEY_ARG,
END = ARGS_KEY_END,
NO_ARGS = ARGS_KEY_NO_ARGS,
INIT = ARGS_KEY_INIT,
SUCCESS = ARGS_KEY_SUCCESS,
ERROR = ARGS_KEY_ERROR,
};
static int parse(argp_t *argp, int argc, char *argv[], void *input) { Parser parser(input, argp); return parser.parse(argc, argv, &parser);