4 * @author Sebastian Hack
6 * Copyright (C) 2005 Universitaet Karlsruhe
7 * Released under the GPL
9 * Enum callback and dump implementation.
18 #include "lc_opts_t.h"
19 #include "lc_opts_enum.h"
22 static const char *delim = " \t|,";
24 #define DECL_CB(N, op) \
25 int lc_opt_enum_ ## N ## _cb(const char *name, lc_opt_type_t type, void *data, size_t len, ...) \
27 lc_opt_enum_ ## N ## _var_t *var = (lc_opt_enum_ ## N ## _var_t*)data; \
28 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
38 va_start(args, len); \
39 arg = va_arg(args, const char *); \
43 tmp = s = (char*)malloc((end + 1) * sizeof(arg[0])); \
48 while (arg[end] != '\0') { \
51 begin = end + strspn(arg + end, delim); \
52 end = begin + strcspn(arg + begin, delim); \
54 s[end - begin] = '\0'; \
56 for (i = 0; items[i].name != NULL; ++i) { \
57 if (strcmp(s, items[i].name) == 0) { \
58 *var->value op items[i].value; \
73 #define DECL_DUMP(T, N, cond) \
74 int lc_opt_enum_ ## N ## _dump(char *buf, size_t n, const char *name, lc_opt_type_t type, void *data, size_t len) \
76 lc_opt_enum_ ## N ## _var_t *var = (lc_opt_enum_ ## N ## _var_t*)data; \
77 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
78 const char *prefix = ""; \
79 TYPE(value) = *var->value; \
81 size_t l = strlen(buf); \
90 for (i = 0; items[i].name != NULL; ++i) { \
91 TYPE(item_value) = items[i].value; \
95 strcat(buf, prefix); \
96 l = strlen(items[i].name); \
99 strcat(buf, items[i].name); \
104 return (int)strlen(buf); \
108 #define DECL_DUMP_VALS(T, N) \
109 int lc_opt_enum_ ## N ## _dump_vals(char *buf, size_t n, const char *name, lc_opt_type_t type, void *data, size_t len) \
111 lc_opt_enum_ ## N ## _var_t *var = (lc_opt_enum_ ## N ## _var_t*) data; \
112 const lc_opt_enum_ ## N ## _items_t *items = var->items; \
113 const char *prefix = ""; \
115 size_t l = strlen(buf); \
124 for (i = 0; items[i].name != NULL; ++i) { \
127 strcat(buf, prefix); n -= 2; \
128 l = strlen(items[i].name); \
131 strcat(buf, items[i].name); \
136 return (int)strlen(buf); \
141 #define TYPE(x) int x
142 DECL_DUMP(int, int, item_value == value)
143 DECL_DUMP_VALS(int, int)
146 #define TYPE(x) unsigned x
147 DECL_DUMP(unsigned, mask, (item_value & value) == item_value)
148 DECL_DUMP_VALS(unsigned, mask)
151 #define TYPE(x) void *x
152 DECL_DUMP(void *, ptr, item_value == value)
153 DECL_DUMP_VALS(void *, ptr)
156 #define TYPE(x) const void *x
157 DECL_DUMP(const void *, const_ptr, item_value == value)
158 DECL_DUMP_VALS(const void *, const_ptr)
161 #define TYPE(x) int (*x)(void)
162 DECL_DUMP(int (*)(void), func_ptr, item_value == value)
163 DECL_DUMP_VALS(int (*)(void), func_ptr)