4 * @author Sebastian Hack
6 * Copyright (C) 2005 Universitaet Karlsruhe
7 * Released under the GPL
9 * Enum callback and dump implementation.
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 = (lc_opt_enum_ ## N ## _var_t*)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 = (char*)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 = (lc_opt_enum_ ## N ## _var_t*)data; \
81 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
82 const char *prefix = ""; \
83 TYPE(value) = *var->value; \
85 size_t l = strlen(buf); \
91 for (i = 0; items[i].name != NULL; ++i) { \
92 TYPE(item_value) = items[i].value; \
96 strcat(buf, prefix); \
97 l = strlen(items[i].name); \
100 strcat(buf, items[i].name); \
105 return strlen(buf); \
109 #define DECL_DUMP_VALS(T, N) \
110 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)) \
112 lc_opt_enum_ ## N ## _var_t *var = (lc_opt_enum_ ## N ## _var_t*) data; \
113 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
114 const char *prefix = ""; \
116 size_t l = strlen(buf); \
122 for (i = 0; items[i].name != NULL; ++i) { \
125 strcat(buf, prefix); n -= 2; \
126 l = strlen(items[i].name); \
129 strcat(buf, items[i].name); \
134 return strlen(buf); \
139 #define TYPE(x) int x
140 DECL_DUMP(int, int, item_value == value)
141 DECL_DUMP_VALS(int, int)
144 #define TYPE(x) unsigned x
145 DECL_DUMP(unsigned, mask, (item_value & value) == item_value)
146 DECL_DUMP_VALS(unsigned, mask)
149 #define TYPE(x) void *x
150 DECL_DUMP(void *, ptr, item_value == value)
151 DECL_DUMP_VALS(void *, ptr)
154 #define TYPE(x) const void *x
155 DECL_DUMP(const void *, const_ptr, item_value == value)
156 DECL_DUMP_VALS(const void *, const_ptr)
159 #define TYPE(x) int (*x)(void)
160 DECL_DUMP(int (*)(void), func_ptr, item_value == value)
161 DECL_DUMP_VALS(int (*)(void), func_ptr)