Skip to content

Command Line

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