struct cmdline_entry {
const char *name;
const char *desc;
const char *arg;
cmdline_callback callback;
char **value;
const char *default_val;
enum cmdline_entry_flags flags;
enum cmdline_entry_status status;
struct cmdline_entry *parent;
enum type_enum type;
void *write_to;
enum errno (*parse)(void *write_to, const char *text);
void *private;
};
enum cmdline_entry_status {
CMDLINE_ENTRY_NOT_FOUND = 0,
CMDLINE_ENTRY_DEFAULTED,
CMDLINE_ENTRY_FOUND,
};
enum cmdline_entry_flags {
CMDLINE_ENTRY_FLAGS_NONE = 0,
CMDLINE_ENTRY_SYMBOLIC = 1,
CMDLINE_ENTRY_REQUIRED = 1 << 1,
};
typedef void (*cmdline_callback)(const char * value, struct cmdline_entry * ent);
enum errno (*cmdline_parse_table[TYPE_MAX])(void *write_to, const char *text);
enum errno cmdline_parse_fx(void *write_to, const char *text);
bool cmdline_is_enabled(const char *str);
void cmdline_parse(const char *input);
bool cmdline_wants_help(const char *input);
__noreturn void cmdline_dump_help(void);
#define CMDLINE_ENTRY_DECLARE(n, ...) \
LINKER_SECTION_OBJECT(struct cmdline_entry, cmdline_entries) \
__cmdline_##n = {.name = #n, \
.status = CMDLINE_ENTRY_NOT_FOUND, \
.type = TYPE_NONE, \
__VA_ARGS__}
#define CMDLINE_ENTRY_DECLARE_TYPED(n, var, ...) \
LINKER_SECTION_OBJECT(struct cmdline_entry, cmdline_entries) \
__cmdline_##n = {.name = #n, \
.status = CMDLINE_ENTRY_NOT_FOUND, \
.write_to = &var, \
.type = TYPE_TO_ENUM((var)), \
__VA_ARGS__}
#define CMDLINE_ENTRY_DECLARE_TYPED_CUSTOM(n, var, pars, ...) \
LINKER_SECTION_OBJECT(struct cmdline_entry, cmdline_entries) \
__cmdline_##n = {.name = #n, \
.status = CMDLINE_ENTRY_NOT_FOUND, \
.write_to = &var, \
.parse = pars, \
.type = TYPE_NONE, \
__VA_ARGS__}
#define CMDLINE_ENTRY_DEFINE(n) extern struct cmdline_entry __cmdline_##n
#define CMDLINE_ENTRY(n, ...) &__cmdline_##n
#define CMDLINE_ENTRY_NAME_LEN_MAX 256