Skip to content

Command Line Macro Internals

include/cmdline_api_internal.h View source View on GitHub
enum errno cmdline_parse_bool(void *write_to, const char *text);
enum errno cmdline_parse_fx(void *write_to, const char *text);
enum errno cmdline_parse_duration(void *write_to, const char *text);
enum errno cmdline_parse_data_size(void *write_to, const char *text);
enum errno cmdline_parse_cpu_mask(void *write_to, const char *text);
enum errno cmdline_parse_mac(void *write_to, const char *text);
enum errno cmdline_parse_string(void *write_to, const char *text);
enum errno cmdline_extract_bool(struct cmdline_value *val, bool *out);
enum errno cmdline_extract_u64(struct cmdline_value *val, uint64_t *out);
enum errno cmdline_extract_i64(struct cmdline_value *val, int64_t *out);
enum errno cmdline_extract_u32(struct cmdline_value *val, uint32_t *out);
enum errno cmdline_extract_i32(struct cmdline_value *val, int32_t *out);
enum errno cmdline_extract_u16(struct cmdline_value *val, uint16_t *out);
enum errno cmdline_extract_i16(struct cmdline_value *val, int16_t *out);
enum errno cmdline_extract_u8(struct cmdline_value *val, uint8_t *out);
enum errno cmdline_extract_i8(struct cmdline_value *val, int8_t *out);
enum errno cmdline_extract_fx(struct cmdline_value *val, fx32_32_t *out);
enum errno cmdline_extract_duration(struct cmdline_value *val, time_ns_t *out);
enum errno cmdline_extract_mac(struct cmdline_value *val, uint64_t *out);
enum errno cmdline_extract_range(struct cmdline_value *val, struct cmdline_range *out);
enum errno cmdline_extract_cpu_mask(struct cmdline_value *val, struct cpu_mask *out);
enum errno cmdline_extract_string(struct cmdline_value *val, char **out);
enum errno cmdline_extract_const_string(struct cmdline_value *val, const char **out);
enum errno cmdline_extract_list(struct cmdline_value *val, struct cmdline_list *out);
#define CMDLINE_TYPE_OFFSET 6
#define CMDLINE_IMPL_TYPE_BIT_1(t1) (1ULL << (t1))
#define CMDLINE_IMPL_TYPE_BIT_2(t1, t2) ((1ULL << (t1)) | (1ULL << (t2)))
#define CMDLINE_IMPL_TYPE_BIT_3(t1, t2, t3) \
    (CMDLINE_IMPL_TYPE_BIT_2(t1, t2) | (1ULL << (t3)))
#define CMDLINE_IMPL_TYPE_BIT_4(t1, t2, t3, t4) \
    (CMDLINE_IMPL_TYPE_BIT_3(t1, t2, t3) | (1ULL << (t4)))
#define CMDLINE_IMPL_TYPE_BIT_5(t1, t2, t3, t4, t5) \
    (CMDLINE_IMPL_TYPE_BIT_4(t1, t2, t3, t4) | (1ULL << (t5)))
#define CMDLINE_STRICT_TYPE_ENUM(var) \
    _Generic((var), \
        bool: TYPE_BOOL, \
        int8_t: TYPE_INT8, \
        uint8_t: TYPE_UINT8, \
        int16_t: TYPE_INT16, \
        uint16_t: TYPE_UINT16, \
        int32_t: TYPE_INT32, \
        uint32_t: TYPE_UINT32, \
        int64_t: TYPE_INT64, \
        uint64_t: TYPE_UINT64)
#define _CMDLINE_CHILD_KIND_POLY 1
#define _CMDLINE_CHILD_KIND_VAR 2
#define _CMDLINE_UNPACK(...) __VA_ARGS__
#define _CMDLINE_CHILD_SYM(parent_n, n) \
    CONCAT(__cmdline_, CONCAT(parent_n, _##n))
#define _CMDLINE_CHILD_DECL_1(parent_n, n, _var, ...) \
    LINKER_SECTION_OBJECT(struct cmdline_entry, cmdline_entries) \
    _CMDLINE_CHILD_SYM(parent_n, n) = {.name = #n, \
                                       .status = CMDLINE_ENTRY_NOT_FOUND, \
                                       .parent = CMDLINE(parent_n), \
                                       .types = 0, \
                                       .range = RANGE(1, 0), \
                                       .choices = NULL, \
                                       .mappings = NULL, \
                                       .flags_table = NULL, \
                                       .value.mode = CMDLINE_MODE_POLYMORPHIC, \
                                       .value.type = CMDLINE_TYPE_NONE, \
                                       .flags = CMDLINE_ENTRY_FLAGS_NONE, \
                                       ##__VA_ARGS__};
#define _CMDLINE_CHILD_DECL_2(parent_n, n, var, ...) \
    LINKER_SECTION_OBJECT(struct cmdline_entry, cmdline_entries) \
    _CMDLINE_CHILD_SYM(parent_n, n) = {.name = #n, \
                                       .status = CMDLINE_ENTRY_NOT_FOUND, \
                                       .parent = CMDLINE(parent_n), \
                                       .types = 0, \
                                       .range = RANGE(1, 0), \
                                       .choices = NULL, \
                                       .mappings = NULL, \
                                       .flags_table = NULL, \
                                       .value.mode = CMDLINE_MODE_VAR, \
                                       .value.write_to = &(var), \
                                       .value.c_type = TYPE_TO_ENUM((var)), \
                                       .value.parse = NULL, \
                                       .flags = CMDLINE_ENTRY_FLAGS_NONE, \
                                       ##__VA_ARGS__};
#define _CMDLINE_CHILD_DECL_DISPATCH(parent_n, kind, n, var, ...) \
    _CMDLINE_CHILD_DECL_##kind(parent_n, n, var, ##__VA_ARGS__)
#define _CMDLINE_CHILD_DECL_EXPAND(parent_n, ...) \
    _CMDLINE_CHILD_DECL_DISPATCH(parent_n, __VA_ARGS__)
#define _CMDLINE_CHILD_DECL_APPLY(parent_n, tuple) \
    _CMDLINE_CHILD_DECL_EXPAND(parent_n, _CMDLINE_UNPACK tuple)
#define _CMDLINE_CHILDREN_MAP_1(p, c1) _CMDLINE_CHILD_DECL_APPLY(p, c1)
#define _CMDLINE_CHILDREN_MAP_2(p, c1, c2) \
    _CMDLINE_CHILD_DECL_APPLY(p, c1) _CMDLINE_CHILD_DECL_APPLY(p, c2)
#define _CMDLINE_CHILDREN_MAP_3(p, c1, c2, c3) \
    _CMDLINE_CHILDREN_MAP_2(p, c1, c2) _CMDLINE_CHILD_DECL_APPLY(p, c3)
#define _CMDLINE_CHILDREN_MAP_4(p, c1, c2, c3, c4) \
    _CMDLINE_CHILDREN_MAP_3(p, c1, c2, c3) _CMDLINE_CHILD_DECL_APPLY(p, c4)
#define _CMDLINE_CHILDREN_MAP_5(p, c1, c2, c3, c4, c5) \
    _CMDLINE_CHILDREN_MAP_4(p, c1, c2, c3, c4) _CMDLINE_CHILD_DECL_APPLY(p, c5)
#define _CMDLINE_CHILDREN_MAP_6(p, c1, c2, c3, c4, c5, c6) \
    _CMDLINE_CHILDREN_MAP_5(p, c1, c2, c3, c4, c5) \
    _CMDLINE_CHILD_DECL_APPLY(p, c6)
#define _CMDLINE_CHILDREN_MAP_7(p, c1, c2, c3, c4, c5, c6, c7) \
    _CMDLINE_CHILDREN_MAP_6(p, c1, c2, c3, c4, c5, c6) \
    _CMDLINE_CHILD_DECL_APPLY(p, c7)
#define _CMDLINE_CHILDREN_MAP_8(p, c1, c2, c3, c4, c5, c6, c7, c8) \
    _CMDLINE_CHILDREN_MAP_7(p, c1, c2, c3, c4, c5, c6, c7) \
    _CMDLINE_CHILD_DECL_APPLY(p, c8)
#define _CMDLINE_CHILDREN_MAP_9(p, c1, c2, c3, c4, c5, c6, c7, c8, c9) \
    _CMDLINE_CHILDREN_MAP_8(p, c1, c2, c3, c4, c5, c6, c7, c8) \
    _CMDLINE_CHILD_DECL_APPLY(p, c9)
#define _CMDLINE_CHILDREN_MAP_10(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) \
    _CMDLINE_CHILDREN_MAP_9(p, c1, c2, c3, c4, c5, c6, c7, c8, c9) \
    _CMDLINE_CHILD_DECL_APPLY(p, c10)
#define _CMDLINE_CHILDREN_MAP_11(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, \
                                 c11) \
    _CMDLINE_CHILDREN_MAP_10(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) \
    _CMDLINE_CHILD_DECL_APPLY(p, c11)
#define _CMDLINE_CHILDREN_MAP_12(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, \
                                 c11, c12) \
    _CMDLINE_CHILDREN_MAP_11(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11) \
    _CMDLINE_CHILD_DECL_APPLY(p, c12)
#define _CMDLINE_CHILDREN_MAP_13(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, \
                                 c11, c12, c13) \
    _CMDLINE_CHILDREN_MAP_12(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, \
                             c12) \
    _CMDLINE_CHILD_DECL_APPLY(p, c13)
#define _CMDLINE_CHILDREN_MAP_14(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, \
                                 c11, c12, c13, c14) \
    _CMDLINE_CHILDREN_MAP_13(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, \
                             c12, c13) \
    _CMDLINE_CHILD_DECL_APPLY(p, c14)
#define _CMDLINE_CHILDREN_MAP_15(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, \
                                 c11, c12, c13, c14, c15) \
    _CMDLINE_CHILDREN_MAP_14(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, \
                             c12, c13, c14) \
    _CMDLINE_CHILD_DECL_APPLY(p, c15)
#define _CMDLINE_CHILDREN_MAP_16(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, \
                                 c11, c12, c13, c14, c15, c16) \
    _CMDLINE_CHILDREN_MAP_15(p, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, \
                             c12, c13, c14, c15) \
    _CMDLINE_CHILD_DECL_APPLY(p, c16)
#define CMDLINE_DECLARE_FX(n, var, ...) \
    CMDLINE_DECLARE_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_FX), \
                        ##__VA_ARGS__)
#define CMDLINE_DECLARE_DURATION(n, var, ...) \
    CMDLINE_DECLARE_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_DURATION), \
                        ##__VA_ARGS__)
#define CMDLINE_DECLARE_SIZE(n, var, ...) \
    CMDLINE_DECLARE_VAR( \
        n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_DATA_SIZE), ##__VA_ARGS__)
#define CMDLINE_DECLARE_CPUS(n, var, ...) \
    CMDLINE_DECLARE_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_CPU_MASK), \
                        ##__VA_ARGS__)
#define CMDLINE_DECLARE_STRING(n, var, ...) \
    CMDLINE_DECLARE_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_STRING), \
                        ##__VA_ARGS__)
#define CMDLINE_CHILD_DECLARE_FX(parent_n, n, var, ...) \
    CMDLINE_CHILD_DECLARE_VAR(parent_n, n, var, \
                              .types = CMDLINE_TYPES(CMDLINE_TYPE_FX), \
                              ##__VA_ARGS__)
#define CMDLINE_CHILD_DECLARE_DURATION(parent_n, n, var, ...) \
    CMDLINE_CHILD_DECLARE_VAR(parent_n, n, var, \
                              .types = CMDLINE_TYPES(CMDLINE_TYPE_DURATION), \
                              ##__VA_ARGS__)
#define CMDLINE_CHILD_DECLARE_SIZE(parent_n, n, var, ...) \
    CMDLINE_CHILD_DECLARE_VAR(parent_n, n, var, \
                              .types = CMDLINE_TYPES(CMDLINE_TYPE_DATA_SIZE), \
                              ##__VA_ARGS__)
#define CMDLINE_CHILD_DECLARE_CPUS(parent_n, n, var, ...) \
    CMDLINE_CHILD_DECLARE_VAR(parent_n, n, var, \
                              .types = CMDLINE_TYPES(CMDLINE_TYPE_CPU_MASK), \
                              ##__VA_ARGS__)
#define CMDLINE_CHILD_DECLARE_STRING(parent_n, n, var, ...) \
    CMDLINE_CHILD_DECLARE_VAR(parent_n, n, var, \
                              .types = CMDLINE_TYPES(CMDLINE_TYPE_STRING), \
                              ##__VA_ARGS__)
#define CMDLINE_INNER_FX(n, var, ...) \
    CMDLINE_INNER_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_FX), \
                      ##__VA_ARGS__)
#define CMDLINE_INNER_DURATION(n, var, ...) \
    CMDLINE_INNER_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_DURATION), \
                      ##__VA_ARGS__)
#define CMDLINE_INNER_SIZE(n, var, ...) \
    CMDLINE_INNER_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_DATA_SIZE), \
                      ##__VA_ARGS__)
#define CMDLINE_INNER_CPUS(n, var, ...) \
    CMDLINE_INNER_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_CPU_MASK), \
                      ##__VA_ARGS__)
#define CMDLINE_INNER_STRING(n, var, ...) \
    CMDLINE_INNER_VAR(n, var, .types = CMDLINE_TYPES(CMDLINE_TYPE_STRING), \
                      ##__VA_ARGS__)
#define CMDLINE_SCHEMA_PROP_FX(struct_type, member, ...) \
    CMDLINE_SCHEMA_PROP(struct_type, member, \
                        .types = CMDLINE_TYPES(CMDLINE_TYPE_FX), \
                        ##__VA_ARGS__)
#define CMDLINE_SCHEMA_PROP_DURATION(struct_type, member, ...) \
    CMDLINE_SCHEMA_PROP(struct_type, member, \
                        .types = CMDLINE_TYPES(CMDLINE_TYPE_DURATION), \
                        ##__VA_ARGS__)
#define CMDLINE_SCHEMA_PROP_SIZE(struct_type, member, ...) \
    CMDLINE_SCHEMA_PROP(struct_type, member, \
                        .types = CMDLINE_TYPES(CMDLINE_TYPE_DATA_SIZE), \
                        ##__VA_ARGS__)
#define CMDLINE_SCHEMA_PROP_CPUS(struct_type, member, ...) \
    CMDLINE_SCHEMA_PROP(struct_type, member, \
                        .types = CMDLINE_TYPES(CMDLINE_TYPE_CPU_MASK), \
                        ##__VA_ARGS__)
#define CMDLINE_SCHEMA_PROP_STRING(struct_type, member, ...) \
    CMDLINE_SCHEMA_PROP(struct_type, member, \
                        .types = CMDLINE_TYPES(CMDLINE_TYPE_STRING), \
                        ##__VA_ARGS__)