isl_arg_parse: support aliases
[isl.git] / include / isl / arg.h
blobd64b3db5d7b5f70ee799ac25cfca20a48460fdee
1 /*
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
8 */
10 #ifndef ISL_ARG_H
11 #define ISL_ARG_H
13 #include <stddef.h>
14 #include <stdlib.h>
16 #if defined(__cplusplus)
17 extern "C" {
18 #endif
20 struct isl_arg_choice {
21 const char *name;
22 unsigned value;
25 struct isl_arg_flags {
26 const char *name;
27 unsigned mask;
28 unsigned value;
31 enum isl_arg_type {
32 isl_arg_end,
33 isl_arg_alias,
34 isl_arg_arg,
35 isl_arg_bool,
36 isl_arg_child,
37 isl_arg_choice,
38 isl_arg_flags,
39 isl_arg_user,
40 isl_arg_long,
41 isl_arg_ulong,
42 isl_arg_str,
43 isl_arg_version
46 struct isl_arg {
47 enum isl_arg_type type;
48 char short_name;
49 const char *long_name;
50 const char *argument_name;
51 size_t offset;
52 const char *help_msg;
53 unsigned flags;
54 union {
55 struct {
56 struct isl_arg_choice *choice;
57 unsigned default_value;
58 unsigned default_selected;
59 int (*set)(void *opt, unsigned val);
60 } choice;
61 struct {
62 struct isl_arg_flags *flags;
63 unsigned default_value;
64 } flags;
65 struct {
66 unsigned default_value;
67 int (*set)(void *opt, unsigned val);
68 } b;
69 struct {
70 long default_value;
71 long default_selected;
72 int (*set)(void *opt, long val);
73 } l;
74 struct {
75 unsigned long default_value;
76 } ul;
77 struct {
78 const char *default_value;
79 } str;
80 struct {
81 struct isl_arg *child;
82 size_t size;
83 } child;
84 struct {
85 void (*print_version)(void);
86 } version;
87 struct {
88 int (*init)(void*);
89 void (*clear)(void*);
90 } user;
91 } u;
94 #define ISL_ARG_ALIAS(l) { \
95 .type = isl_arg_alias, \
96 .long_name = l, \
98 #define ISL_ARG_ARG(st,f,a,d) { \
99 .type = isl_arg_arg, \
100 .argument_name = a, \
101 .offset = offsetof(st, f), \
102 .u = { .str = { .default_value = d } } \
104 #define ISL_ARG_CHOICE(st,f,s,l,c,d,h) { \
105 .type = isl_arg_choice, \
106 .short_name = s, \
107 .long_name = l, \
108 .offset = offsetof(st, f), \
109 .help_msg = h, \
110 .u = { .choice = { .choice = c, .default_value = d, \
111 .default_selected = d, .set = NULL } } \
113 #define ISL_ARG_OPT_CHOICE(st,f,s,l,c,d,ds,h) { \
114 .type = isl_arg_choice, \
115 .short_name = s, \
116 .long_name = l, \
117 .offset = offsetof(st, f), \
118 .help_msg = h, \
119 .u = { .choice = { .choice = c, .default_value = d, \
120 .default_selected = ds, .set = NULL } } \
122 #define ISL_ARG_USER_OPT_CHOICE(st,f,s,l,c,setter,d,ds,h) { \
123 .type = isl_arg_choice, \
124 .short_name = s, \
125 .long_name = l, \
126 .offset = offsetof(st, f), \
127 .help_msg = h, \
128 .u = { .choice = { .choice = c, .default_value = d, \
129 .default_selected = ds, .set = setter } } \
131 #define _ISL_ARG_BOOL_F(o,s,l,setter,d,h,fl) { \
132 .type = isl_arg_bool, \
133 .short_name = s, \
134 .long_name = l, \
135 .offset = o, \
136 .help_msg = h, \
137 .flags = fl, \
138 .u = { .b = { .default_value = d, .set = setter } } \
140 #define ISL_ARG_BOOL_F(st,f,s,l,d,h,fl) \
141 _ISL_ARG_BOOL_F(offsetof(st, f),s,l,NULL,d,h,fl)
142 #define ISL_ARG_BOOL(st,f,s,l,d,h) \
143 ISL_ARG_BOOL_F(st,f,s,l,d,h,0)
144 #define ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,fl) \
145 _ISL_ARG_BOOL_F(-1,s,l,setter,0,h,fl)
146 #define ISL_ARG_PHANTOM_BOOL(s,l,setter,h) \
147 ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,0)
148 #define ISL_ARG_LONG(st,f,s,lo,d,h) { \
149 .type = isl_arg_long, \
150 .short_name = s, \
151 .long_name = lo, \
152 .offset = offsetof(st, f), \
153 .help_msg = h, \
154 .u = { .l = { .default_value = d, .default_selected = d, \
155 .set = NULL } } \
157 #define ISL_ARG_USER_LONG(st,f,s,lo,setter,d,h) { \
158 .type = isl_arg_long, \
159 .short_name = s, \
160 .long_name = lo, \
161 .offset = offsetof(st, f), \
162 .help_msg = h, \
163 .u = { .l = { .default_value = d, .default_selected = d, \
164 .set = setter } } \
166 #define ISL_ARG_OPT_LONG(st,f,s,lo,d,ds,h) { \
167 .type = isl_arg_long, \
168 .short_name = s, \
169 .long_name = lo, \
170 .offset = offsetof(st, f), \
171 .help_msg = h, \
172 .u = { .l = { .default_value = d, .default_selected = ds, \
173 .set = NULL } } \
175 #define ISL_ARG_ULONG(st,f,s,l,d,h) { \
176 .type = isl_arg_ulong, \
177 .short_name = s, \
178 .long_name = l, \
179 .offset = offsetof(st, f), \
180 .help_msg = h, \
181 .u = { .ul = { .default_value = d } } \
183 #define ISL_ARG_STR(st,f,s,l,a,d,h) { \
184 .type = isl_arg_str, \
185 .short_name = s, \
186 .long_name = l, \
187 .argument_name = a, \
188 .offset = offsetof(st, f), \
189 .help_msg = h, \
190 .u = { .str = { .default_value = d } } \
192 #define ISL_ARG_CHILD(st,f,l,c,h) { \
193 .type = isl_arg_child, \
194 .long_name = l, \
195 .offset = offsetof(st, f), \
196 .help_msg = h, \
197 .u = { .child = { .child = c, .size = sizeof(*((st *)NULL)->f) } }\
199 #define ISL_ARG_FLAGS(st,f,s,l,c,d,h) { \
200 .type = isl_arg_flags, \
201 .short_name = s, \
202 .long_name = l, \
203 .offset = offsetof(st, f), \
204 .help_msg = h, \
205 .u = { .flags = { .flags = c, .default_value = d } } \
207 #define ISL_ARG_USER(st,f,i,c) { \
208 .type = isl_arg_user, \
209 .offset = offsetof(st, f), \
210 .u = { .user = { .init = i, .clear = c} } \
212 #define ISL_ARG_VERSION(print) { \
213 .type = isl_arg_version, \
214 .u = { .version = { .print_version = print } } \
216 #define ISL_ARG_END { isl_arg_end }
218 #define ISL_ARG_ALL (1 << 0)
220 void isl_arg_set_defaults(struct isl_arg *arg, void *opt);
221 void isl_arg_free(struct isl_arg *arg, void *opt);
222 int isl_arg_parse(struct isl_arg *arg, int argc, char **argv, void *opt,
223 unsigned flags);
225 #define ISL_ARG_DECL(prefix,st,arg) \
226 extern struct isl_arg arg[]; \
227 st *prefix ## _new_with_defaults(); \
228 void prefix ## _free(st *opt); \
229 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags);
231 #define ISL_ARG_DEF(prefix,st,arg) \
232 st *prefix ## _new_with_defaults() \
234 st *opt = (st *)calloc(1, sizeof(st)); \
235 if (opt) \
236 isl_arg_set_defaults(arg, opt); \
237 return opt; \
240 void prefix ## _free(st *opt) \
242 isl_arg_free(arg, opt); \
245 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags) \
247 return isl_arg_parse(arg, argc, argv, opt, flags); \
250 #if defined(__cplusplus)
252 #endif
254 #endif