2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the GNU LGPLv2.1 license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
16 #if defined(__cplusplus)
20 struct isl_arg_choice {
25 struct isl_arg_flags {
48 enum isl_arg_type type;
50 const char *long_name;
51 const char *argument_name;
54 #define ISL_ARG_SINGLE_DASH (1 << 0)
55 #define ISL_ARG_BOOL_ARG (1 << 1)
56 #define ISL_ARG_HIDDEN (1 << 2)
60 struct isl_arg_choice *choice;
61 unsigned default_value;
62 unsigned default_selected;
63 int (*set)(void *opt, unsigned val);
66 struct isl_arg_flags *flags;
67 unsigned default_value;
70 unsigned default_value;
71 int (*set)(void *opt, unsigned val);
78 long default_selected;
79 int (*set)(void *opt, long val);
82 unsigned long default_value;
85 const char *default_value;
88 struct isl_arg *child;
92 void (*print_version)(void);
101 #define ISL_ARG_ALIAS(l) { \
102 .type = isl_arg_alias, \
105 #define ISL_ARG_ARG(st,f,a,d) { \
106 .type = isl_arg_arg, \
107 .argument_name = a, \
108 .offset = offsetof(st, f), \
109 .u = { .str = { .default_value = d } } \
111 #define ISL_ARG_CHOICE(st,f,s,l,c,d,h) { \
112 .type = isl_arg_choice, \
115 .offset = offsetof(st, f), \
117 .u = { .choice = { .choice = c, .default_value = d, \
118 .default_selected = d, .set = NULL } } \
120 #define ISL_ARG_OPT_CHOICE(st,f,s,l,c,d,ds,h) { \
121 .type = isl_arg_choice, \
124 .offset = offsetof(st, f), \
126 .u = { .choice = { .choice = c, .default_value = d, \
127 .default_selected = ds, .set = NULL } } \
129 #define ISL_ARG_USER_OPT_CHOICE(st,f,s,l,c,setter,d,ds,h) { \
130 .type = isl_arg_choice, \
133 .offset = offsetof(st, f), \
135 .u = { .choice = { .choice = c, .default_value = d, \
136 .default_selected = ds, .set = setter } } \
138 #define _ISL_ARG_BOOL_F(o,s,l,setter,d,h,fl) { \
139 .type = isl_arg_bool, \
145 .u = { .b = { .default_value = d, .set = setter } } \
147 #define ISL_ARG_BOOL_F(st,f,s,l,d,h,fl) \
148 _ISL_ARG_BOOL_F(offsetof(st, f),s,l,NULL,d,h,fl)
149 #define ISL_ARG_BOOL(st,f,s,l,d,h) \
150 ISL_ARG_BOOL_F(st,f,s,l,d,h,0)
151 #define ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,fl) \
152 _ISL_ARG_BOOL_F(-1,s,l,setter,0,h,fl)
153 #define ISL_ARG_PHANTOM_BOOL(s,l,setter,h) \
154 ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,0)
155 #define ISL_ARG_INT_F(st,f,s,l,a,d,h,fl) { \
156 .type = isl_arg_int, \
159 .argument_name = a, \
160 .offset = offsetof(st, f), \
163 .u = { .ul = { .default_value = d } } \
165 #define ISL_ARG_INT(st,f,s,l,a,d,h) \
166 ISL_ARG_INT_F(st,f,s,l,a,d,h,0)
167 #define ISL_ARG_LONG(st,f,s,lo,d,h) { \
168 .type = isl_arg_long, \
171 .offset = offsetof(st, f), \
173 .u = { .l = { .default_value = d, .default_selected = d, \
176 #define ISL_ARG_USER_LONG(st,f,s,lo,setter,d,h) { \
177 .type = isl_arg_long, \
180 .offset = offsetof(st, f), \
182 .u = { .l = { .default_value = d, .default_selected = d, \
185 #define ISL_ARG_OPT_LONG(st,f,s,lo,d,ds,h) { \
186 .type = isl_arg_long, \
189 .offset = offsetof(st, f), \
191 .u = { .l = { .default_value = d, .default_selected = ds, \
194 #define ISL_ARG_ULONG(st,f,s,l,d,h) { \
195 .type = isl_arg_ulong, \
198 .offset = offsetof(st, f), \
200 .u = { .ul = { .default_value = d } } \
202 #define ISL_ARG_STR(st,f,s,l,a,d,h) { \
203 .type = isl_arg_str, \
206 .argument_name = a, \
207 .offset = offsetof(st, f), \
209 .u = { .str = { .default_value = d } } \
211 #define ISL_ARG_CHILD(st,f,l,c,h) { \
212 .type = isl_arg_child, \
214 .offset = offsetof(st, f), \
216 .u = { .child = { .child = c, .size = sizeof(*((st *)NULL)->f) } }\
218 #define ISL_ARG_FLAGS(st,f,s,l,c,d,h) { \
219 .type = isl_arg_flags, \
222 .offset = offsetof(st, f), \
224 .u = { .flags = { .flags = c, .default_value = d } } \
226 #define ISL_ARG_USER(st,f,i,c) { \
227 .type = isl_arg_user, \
228 .offset = offsetof(st, f), \
229 .u = { .user = { .init = i, .clear = c} } \
231 #define ISL_ARG_VERSION(print) { \
232 .type = isl_arg_version, \
233 .u = { .version = { .print_version = print } } \
235 #define ISL_ARG_END { isl_arg_end }
237 #define ISL_ARG_ALL (1 << 0)
239 void isl_arg_set_defaults(struct isl_arg *arg, void *opt);
240 void isl_arg_free(struct isl_arg *arg, void *opt);
241 int isl_arg_parse(struct isl_arg *arg, int argc, char **argv, void *opt,
244 #define ISL_ARG_DECL(prefix,st,arg) \
245 extern struct isl_arg arg[]; \
246 st *prefix ## _new_with_defaults(); \
247 void prefix ## _free(st *opt); \
248 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags);
250 #define ISL_ARG_DEF(prefix,st,arg) \
251 st *prefix ## _new_with_defaults() \
253 st *opt = (st *)calloc(1, sizeof(st)); \
255 isl_arg_set_defaults(arg, opt); \
259 void prefix ## _free(st *opt) \
261 isl_arg_free(arg, opt); \
264 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags) \
266 return isl_arg_parse(arg, argc, argv, opt, flags); \
269 #if defined(__cplusplus)