4 * @author Sebastian Hack
6 * Copyright (C) 2005 Universitaet Karlsruhe
7 * Released under the GPL
9 * Enum callback and dump implementation.
17 #if defined(__FreeBSD__)
25 #include "lc_opts_t.h"
26 #include "lc_opts_enum.h"
28 static const char *delim = " \t|,";
30 #define DECL_CB(N, op) \
31 int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, size_t len, ...) \
33 lc_opt_enum_ ## N ## _var_t *var = data; \
34 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
42 va_start(args, len); \
43 arg = va_arg(args, const char *); \
47 tmp = s = malloc((end + 1) * sizeof(arg[0])); \
52 while(arg[end] != '\0') { \
55 begin = end + strspn(arg + end, delim); \
56 end = begin + strcspn(arg + begin, delim); \
58 s[end - begin] = '\0'; \
60 for(i = 0; items[i].name != NULL; ++i) { \
61 if(strcmp(s, items[i].name) == 0) { \
62 *var->value op items[i].value; \
77 #define DECL_DUMP(T, N, cond) \
78 int lc_opt_enum_ ## N ## _dump(char *buf, size_t n, LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, LC_UNUSED(size_t len)) \
80 lc_opt_enum_ ## N ## _var_t *var = data; \
81 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
82 const char *prefix = ""; \
83 TYPE(value) = *var->value; \
86 for(i = 0; items[i].name != NULL; ++i) { \
87 TYPE(item_value) = items[i].value; \
89 strncat(buf, prefix, n); \
90 strncat(buf, items[i].name, n); \
99 #define DECL_DUMP_VALS(T, N) \
100 int lc_opt_enum_ ## N ## _dump_vals(char *buf, size_t n, LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, LC_UNUSED(size_t len)) \
102 lc_opt_enum_ ## N ## _var_t *var = data; \
103 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
104 const char *prefix = ""; \
107 for(i = 0; items[i].name != NULL; ++i) { \
108 strncat(buf, prefix, n); \
109 strncat(buf, items[i].name, n); \
113 return strlen(buf); \
118 #define TYPE(x) int x
119 DECL_DUMP(int, int, item_value == value)
120 DECL_DUMP_VALS(int, int)
123 #define TYPE(x) unsigned x
124 DECL_DUMP(unsigned, mask, (item_value & value) == item_value)
125 DECL_DUMP_VALS(unsigned, mask)
128 #define TYPE(x) void *x
129 DECL_DUMP(void *, ptr, item_value == value)
130 DECL_DUMP_VALS(void *, ptr)
133 #define TYPE(x) const void *x
134 DECL_DUMP(const void *, const_ptr, item_value == value)
135 DECL_DUMP_VALS(const void *, const_ptr)
138 #define TYPE(x) int (*x)(void)
139 DECL_DUMP(int (*)(void), func_ptr, item_value == value)
140 DECL_DUMP_VALS(int (*)(void), func_ptr)