struct isl_arg_choice *choice;
unsigned default_value;
unsigned default_selected;
+ int (*set)(void *opt, unsigned val);
} choice;
struct {
struct isl_arg_flags *flags;
.offset = offsetof(st, f), \
.help_msg = h, \
.u = { .choice = { .choice = c, .default_value = d, \
- .default_selected = d } } \
+ .default_selected = d, .set = NULL } } \
},
#define ISL_ARG_OPT_CHOICE(st,f,s,l,c,d,ds,h) { \
.type = isl_arg_choice, \
.offset = offsetof(st, f), \
.help_msg = h, \
.u = { .choice = { .choice = c, .default_value = d, \
- .default_selected = ds } } \
+ .default_selected = ds, .set = NULL } } \
+},
+#define ISL_ARG_USER_OPT_CHOICE(st,f,s,l,c,setter,d,ds,h) { \
+ .type = isl_arg_choice, \
+ .short_name = s, \
+ .long_name = l, \
+ .offset = offsetof(st, f), \
+ .help_msg = h, \
+ .u = { .choice = { .choice = c, .default_value = d, \
+ .default_selected = ds, .set = setter } } \
},
#define ISL_ARG_BOOL(st,f,s,l,d,h) { \
.type = isl_arg_bool, \
return 0;
if (!has_argument && (!arg[1] || arg[1][0] == '-')) {
- *(unsigned *)(((char *)opt) + decl->offset) =
- decl->u.choice.default_selected;
+ unsigned u = decl->u.choice.default_selected;
+ if (decl->u.choice.set)
+ decl->u.choice.set(opt, u);
+ else
+ *(unsigned *)(((char *)opt) + decl->offset) = u;
return 1;
}
choice = arg[1];
for (i = 0; decl->u.choice.choice[i].name; ++i) {
+ unsigned u;
+
if (strcmp(choice, decl->u.choice.choice[i].name))
continue;
- *(unsigned *)(((char *)opt) + decl->offset) =
- decl->u.choice.choice[i].value;
+ u = decl->u.choice.choice[i].value;
+ if (decl->u.choice.set)
+ decl->u.choice.set(opt, u);
+ else
+ *(unsigned *)(((char *)opt) + decl->offset) = u;
return has_argument ? 1 : 2;
}