4 * @author Sebastian Hack
6 * Copyright (C) 2005 Universitaet Karlsruhe
7 * Released under the GPL
9 * Enum callback and dump implementation.
18 #if defined(__FreeBSD__)
26 #include "lc_opts_t.h"
27 #include "lc_opts_enum.h"
29 static const char *delim = " \t|,";
31 #define DECL_CB(N, op) \
32 int lc_opt_enum_ ## N ## _cb(LC_UNUSED(const char *name), LC_UNUSED(lc_opt_type_t type), void *data, size_t len, ...) \
34 lc_opt_enum_ ## N ## _var_t *var = data; \
35 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
43 va_start(args, len); \
44 arg = va_arg(args, const char *); \
48 tmp = s = malloc((end + 1) * sizeof(arg[0])); \
53 while(arg[end] != '\0') { \
56 begin = end + strspn(arg + end, delim); \
57 end = begin + strcspn(arg + begin, delim); \
59 s[end - begin] = '\0'; \
61 for(i = 0; items[i].name != NULL; ++i) { \
62 if(strcmp(s, items[i].name) == 0) { \
63 *var->value op items[i].value; \
78 #define DECL_DUMP(T, N, cond) \
79 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)) \
81 lc_opt_enum_ ## N ## _var_t *var = data; \
82 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
83 const char *prefix = ""; \
84 TYPE(value) = *var->value; \
87 for(i = 0; items[i].name != NULL; ++i) { \
88 TYPE(item_value) = items[i].value; \
90 strncat(buf, prefix, n); \
91 strncat(buf, items[i].name, n); \
100 #define DECL_DUMP_VALS(T, N) \
101 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)) \
103 lc_opt_enum_ ## N ## _var_t *var = data; \
104 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
105 const char *prefix = ""; \
108 for(i = 0; items[i].name != NULL; ++i) { \
109 strncat(buf, prefix, n); \
110 strncat(buf, items[i].name, n); \
114 return strlen(buf); \
119 #define TYPE(x) int x
120 DECL_DUMP(int, int, item_value == value)
121 DECL_DUMP_VALS(int, int)
124 #define TYPE(x) unsigned x
125 DECL_DUMP(unsigned, mask, (item_value & value) == item_value)
126 DECL_DUMP_VALS(unsigned, mask)
129 #define TYPE(x) void *x
130 DECL_DUMP(void *, ptr, item_value == value)
131 DECL_DUMP_VALS(void *, ptr)
134 #define TYPE(x) const void *x
135 DECL_DUMP(const void *, const_ptr, item_value == value)
136 DECL_DUMP_VALS(const void *, const_ptr)
139 #define TYPE(x) int (*x)(void)
140 DECL_DUMP(int (*)(void), func_ptr, item_value == value)
141 DECL_DUMP_VALS(int (*)(void), func_ptr)