bescripts: Remove unused features and stale uses of gone features.
[libfirm] / ir / libcore / lc_opts_enum.c
1 /**
2  * @file   lc_opts_enum.c
3  * @date   24.11.2005
4  * @author Sebastian Hack
5  *
6  * Copyright (C) 2005 Universitaet Karlsruhe
7  * Released under the GPL
8  *
9  * Enum callback and dump implementation.
10  */
11 #include "config.h"
12
13 #include <stdlib.h>
14 #include <stdarg.h>
15 #include <stdio.h>
16 #include <string.h>
17
18 #include "lc_opts_t.h"
19 #include "lc_opts_enum.h"
20 #include "xmalloc.h"
21
22 static const char *delim = " \t|,";
23
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, ...) \
26 { \
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; \
29  \
30         va_list args; \
31         char *s, *tmp; \
32         size_t begin, end; \
33         const char *arg; \
34         int res = 0; \
35  \
36         (void) name; \
37         (void) type; \
38         va_start(args, len); \
39         arg = va_arg(args, const char *); \
40         va_end(args); \
41         \
42         end     = strlen(arg); \
43         tmp = s = (char*)malloc((end + 1) * sizeof(arg[0])); \
44         strcpy(s, arg); \
45         s[end]  = '\0'; \
46         \
47         end = 0; \
48         while (arg[end] != '\0') { \
49                 unsigned int i; \
50                 \
51                 begin  = end + strspn(arg + end, delim); \
52                 end    = begin + strcspn(arg + begin, delim); \
53                 s      = tmp + begin; \
54                 s[end - begin] = '\0'; \
55                 \
56                 for (i = 0; items[i].name != NULL; ++i) { \
57                         if (strcmp(s, items[i].name) == 0) { \
58                                 *var->value op items[i].value; \
59                                 res = 1; \
60                         } \
61                 } \
62         } \
63         free(tmp); \
64         return res; \
65 } \
66
67 DECL_CB(int, =)
68 DECL_CB(mask, |=)
69 DECL_CB(ptr, =)
70 DECL_CB(const_ptr, =)
71 DECL_CB(func_ptr, =)
72
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) \
75 { \
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; \
80         int i; \
81         size_t l = strlen(buf); \
82         (void) name; \
83         (void) type; \
84         (void) len; \
85  \
86         if (l >= n) \
87                 return (int)l; \
88         n -= l; \
89         n += 2; \
90         for (i = 0; items[i].name != NULL; ++i) { \
91                 TYPE(item_value) = items[i].value; \
92                 if (cond) { \
93                         if (n <= 2) \
94                                 break; \
95                         strcat(buf, prefix); \
96                         l = strlen(items[i].name); \
97                         if (n <= l) \
98                                 break; \
99                         strcat(buf, items[i].name); \
100                         prefix = ", "; \
101                 } \
102         } \
103  \
104         return (int)strlen(buf); \
105 } \
106
107
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) \
110 { \
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                         = "";         \
114         int i; \
115         size_t l = strlen(buf); \
116         (void) name; \
117         (void) type; \
118         (void) len; \
119  \
120         if (l >= n) \
121                 return (int)l; \
122         n -= l; \
123         n += 2; \
124         for (i = 0; items[i].name != NULL; ++i) { \
125                 if (n <= 2) \
126                         break; \
127                 strcat(buf, prefix); n -= 2; \
128                 l = strlen(items[i].name); \
129                 if (n <= l) \
130                         break; \
131                 strcat(buf, items[i].name); \
132                 n -= l; \
133                 prefix = ", "; \
134         } \
135  \
136         return (int)strlen(buf); \
137 } \
138
139
140
141 #define TYPE(x) int x
142 DECL_DUMP(int, int, item_value == value)
143 DECL_DUMP_VALS(int, int)
144 #undef TYPE
145
146 #define TYPE(x) unsigned x
147 DECL_DUMP(unsigned, mask, (item_value & value) == item_value)
148 DECL_DUMP_VALS(unsigned, mask)
149 #undef TYPE
150
151 #define TYPE(x) void *x
152 DECL_DUMP(void *, ptr, item_value == value)
153 DECL_DUMP_VALS(void *, ptr)
154 #undef TYPE
155
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)
159 #undef TYPE
160
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)
164 #undef TYPE