isl 0.04
[isl.git] / include / isl_arg.h
blob336a3c2902969b854dfd857a038631d2045117f7
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_arg,
34 isl_arg_bool,
35 isl_arg_child,
36 isl_arg_choice,
37 isl_arg_flags,
38 isl_arg_user,
39 isl_arg_long,
40 isl_arg_ulong,
41 isl_arg_str,
42 isl_arg_version
45 struct isl_arg {
46 enum isl_arg_type type;
47 char short_name;
48 const char *long_name;
49 const char *argument_name;
50 size_t offset;
51 const char *help_msg;
52 union {
53 struct {
54 struct isl_arg_choice *choice;
55 unsigned default_value;
56 unsigned default_selected;
57 int (*set)(void *opt, unsigned val);
58 } choice;
59 struct {
60 struct isl_arg_flags *flags;
61 unsigned default_value;
62 } flags;
63 struct {
64 unsigned default_value;
65 } b;
66 struct {
67 long default_value;
68 long default_selected;
69 int (*set)(void *opt, long val);
70 } l;
71 struct {
72 unsigned long default_value;
73 } ul;
74 struct {
75 const char *default_value;
76 } str;
77 struct {
78 struct isl_arg *child;
79 size_t size;
80 } child;
81 struct {
82 void (*print_version)(void);
83 } version;
84 struct {
85 int (*init)(void*);
86 void (*clear)(void*);
87 } user;
88 } u;
91 #define ISL_ARG_ARG(st,f,a,d) { \
92 .type = isl_arg_arg, \
93 .argument_name = a, \
94 .offset = offsetof(st, f), \
95 .u = { .str = { .default_value = d } } \
97 #define ISL_ARG_CHOICE(st,f,s,l,c,d,h) { \
98 .type = isl_arg_choice, \
99 .short_name = s, \
100 .long_name = l, \
101 .offset = offsetof(st, f), \
102 .help_msg = h, \
103 .u = { .choice = { .choice = c, .default_value = d, \
104 .default_selected = d, .set = NULL } } \
106 #define ISL_ARG_OPT_CHOICE(st,f,s,l,c,d,ds,h) { \
107 .type = isl_arg_choice, \
108 .short_name = s, \
109 .long_name = l, \
110 .offset = offsetof(st, f), \
111 .help_msg = h, \
112 .u = { .choice = { .choice = c, .default_value = d, \
113 .default_selected = ds, .set = NULL } } \
115 #define ISL_ARG_USER_OPT_CHOICE(st,f,s,l,c,setter,d,ds,h) { \
116 .type = isl_arg_choice, \
117 .short_name = s, \
118 .long_name = l, \
119 .offset = offsetof(st, f), \
120 .help_msg = h, \
121 .u = { .choice = { .choice = c, .default_value = d, \
122 .default_selected = ds, .set = setter } } \
124 #define ISL_ARG_BOOL(st,f,s,l,d,h) { \
125 .type = isl_arg_bool, \
126 .short_name = s, \
127 .long_name = l, \
128 .offset = offsetof(st, f), \
129 .help_msg = h, \
130 .u = { .b = { .default_value = d } } \
132 #define ISL_ARG_LONG(st,f,s,lo,d,h) { \
133 .type = isl_arg_long, \
134 .short_name = s, \
135 .long_name = lo, \
136 .offset = offsetof(st, f), \
137 .help_msg = h, \
138 .u = { .l = { .default_value = d, .default_selected = d, \
139 .set = NULL } } \
141 #define ISL_ARG_USER_LONG(st,f,s,lo,setter,d,h) { \
142 .type = isl_arg_long, \
143 .short_name = s, \
144 .long_name = lo, \
145 .offset = offsetof(st, f), \
146 .help_msg = h, \
147 .u = { .l = { .default_value = d, .default_selected = d, \
148 .set = setter } } \
150 #define ISL_ARG_OPT_LONG(st,f,s,lo,d,ds,h) { \
151 .type = isl_arg_long, \
152 .short_name = s, \
153 .long_name = lo, \
154 .offset = offsetof(st, f), \
155 .help_msg = h, \
156 .u = { .l = { .default_value = d, .default_selected = ds, \
157 .set = NULL } } \
159 #define ISL_ARG_ULONG(st,f,s,l,d,h) { \
160 .type = isl_arg_ulong, \
161 .short_name = s, \
162 .long_name = l, \
163 .offset = offsetof(st, f), \
164 .help_msg = h, \
165 .u = { .ul = { .default_value = d } } \
167 #define ISL_ARG_STR(st,f,s,l,a,d,h) { \
168 .type = isl_arg_str, \
169 .short_name = s, \
170 .long_name = l, \
171 .argument_name = a, \
172 .offset = offsetof(st, f), \
173 .help_msg = h, \
174 .u = { .str = { .default_value = d } } \
176 #define ISL_ARG_CHILD(st,f,l,c,h) { \
177 .type = isl_arg_child, \
178 .long_name = l, \
179 .offset = offsetof(st, f), \
180 .help_msg = h, \
181 .u = { .child = { .child = c, .size = sizeof(*((st *)NULL)->f) } }\
183 #define ISL_ARG_FLAGS(st,f,s,l,c,d,h) { \
184 .type = isl_arg_flags, \
185 .short_name = s, \
186 .long_name = l, \
187 .offset = offsetof(st, f), \
188 .help_msg = h, \
189 .u = { .flags = { .flags = c, .default_value = d } } \
191 #define ISL_ARG_USER(st,f,i,c) { \
192 .type = isl_arg_user, \
193 .offset = offsetof(st, f), \
194 .u = { .user = { .init = i, .clear = c} } \
196 #define ISL_ARG_VERSION(print) { \
197 .type = isl_arg_version, \
198 .u = { .version = { .print_version = print } } \
200 #define ISL_ARG_END { isl_arg_end }
202 #define ISL_ARG_ALL (1 << 0)
204 void isl_arg_set_defaults(struct isl_arg *arg, void *opt);
205 void isl_arg_free(struct isl_arg *arg, void *opt);
206 int isl_arg_parse(struct isl_arg *arg, int argc, char **argv, void *opt,
207 unsigned flags);
209 #define ISL_ARG_DECL(prefix,st,arg) \
210 extern struct isl_arg arg[]; \
211 st *prefix ## _new_with_defaults(); \
212 void prefix ## _free(st *opt); \
213 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags);
215 #define ISL_ARG_DEF(prefix,st,arg) \
216 st *prefix ## _new_with_defaults() \
218 st *opt = (st *)calloc(1, sizeof(st)); \
219 if (opt) \
220 isl_arg_set_defaults(arg, opt); \
221 return opt; \
224 void prefix ## _free(st *opt) \
226 isl_arg_free(arg, opt); \
229 int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags) \
231 return isl_arg_parse(arg, argc, argv, opt, flags); \
234 #if defined(__cplusplus)
236 #endif
238 #endif