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
17 static void set_default_choice(struct isl_arg
*arg
, void *opt
)
19 *(unsigned *)(((char *)opt
) + arg
->offset
) = arg
->u
.choice
.default_value
;
22 static void set_default_bool(struct isl_arg
*arg
, void *opt
)
24 *(unsigned *)(((char *)opt
) + arg
->offset
) = arg
->u
.b
.default_value
;
27 static void set_default_child(struct isl_arg
*arg
, void *opt
)
29 void *child
= calloc(1, arg
->u
.child
.size
);
32 isl_arg_set_defaults(arg
->u
.child
.child
, child
);
34 *(void **)(((char *)opt
) + arg
->offset
) = child
;
37 void isl_arg_set_defaults(struct isl_arg
*arg
, void *opt
)
41 for (i
= 0; arg
[i
].type
!= isl_arg_end
; ++i
) {
42 switch (arg
[i
].type
) {
44 set_default_choice(&arg
[i
], opt
);
47 set_default_bool(&arg
[i
], opt
);
50 set_default_child(&arg
[i
], opt
);
56 static void print_arg_help(struct isl_arg
*decl
, const char *prefix
)
59 printf(" -%c, --", decl
->short_name
);
63 printf("%s-", prefix
);
64 printf("%s", decl
->long_name
);
67 static void print_choice_help(struct isl_arg
*decl
, const char *prefix
)
71 print_arg_help(decl
, prefix
);
74 for (i
= 0; decl
->u
.choice
.choice
[i
].name
; ++i
) {
77 printf("%s", decl
->u
.choice
.choice
[i
].name
);
83 static void print_bool_help(struct isl_arg
*decl
, const char *prefix
)
85 print_arg_help(decl
, prefix
);
89 static void print_help(struct isl_arg
*arg
, const char *prefix
)
93 for (i
= 0; arg
[i
].type
!= isl_arg_end
; ++i
) {
94 switch (arg
[i
].type
) {
96 print_choice_help(&arg
[i
], prefix
);
99 print_bool_help(&arg
[i
], prefix
);
104 for (i
= 0; arg
[i
].type
!= isl_arg_end
; ++i
) {
105 if (arg
[i
].type
!= isl_arg_child
)
109 print_help(arg
[i
].u
.child
.child
, arg
[i
].long_name
);
113 static void print_help_and_exit(struct isl_arg
*arg
, const char *prog
)
117 slash
= strrchr(prog
, '/');
119 printf("Usage: %s [OPTION...]\n\n", slash
+ 1);
121 print_help(arg
, NULL
);
126 static int parse_choice_option(struct isl_arg
*decl
, const char *arg
,
127 const char *prefix
, void *opt
)
133 if (strncmp(arg
, "--", 2))
137 equal
= strchr(name
, '=');
142 size_t prefix_len
= strlen(prefix
);
143 if (strncmp(name
, prefix
, prefix_len
) == 0 &&
144 name
[prefix_len
] == '-')
145 name
+= prefix_len
+ 1;
148 if (strncmp(name
, decl
->long_name
, equal
- name
))
151 for (i
= 0; decl
->u
.choice
.choice
[i
].name
; ++i
) {
152 if (strcmp(equal
+ 1, decl
->u
.choice
.choice
[i
].name
))
155 *(unsigned *)(((char *)opt
) + decl
->offset
) =
156 decl
->u
.choice
.choice
[i
].value
;
164 static int parse_bool_option(struct isl_arg
*decl
, const char *arg
, void *opt
)
168 if ((arg
[0] == '-' && arg
[1] == decl
->short_name
&& arg
[2] == '\0') ||
169 (strncmp(arg
, "--", 2) == 0 &&
170 strcmp(arg
+ 2, decl
->long_name
) == 0)) {
171 *(unsigned *)(((char *)opt
) + decl
->offset
) = 1;
179 static int parse_option(struct isl_arg
*decl
, const char *arg
,
180 const char *prefix
, void *opt
);
182 static int parse_child_option(struct isl_arg
*decl
, const char *arg
, void *opt
)
184 return parse_option(decl
->u
.child
.child
, arg
, decl
->long_name
,
185 *(void **)(((char *)opt
) + decl
->offset
));
188 static int parse_option(struct isl_arg
*decl
, const char *arg
,
189 const char *prefix
, void *opt
)
193 for (i
= 0; decl
[i
].type
!= isl_arg_end
; ++i
) {
194 switch (decl
[i
].type
) {
196 if (parse_choice_option(&decl
[i
], arg
, prefix
, opt
))
200 if (parse_bool_option(&decl
[i
], arg
, opt
))
204 if (parse_child_option(&decl
[i
], arg
, opt
))
213 static int drop_argument(int argc
, char **argv
, int drop
)
215 for (; drop
< argc
; ++drop
)
216 argv
[drop
] = argv
[drop
+ 1];
221 int isl_arg_parse(struct isl_arg
*arg
, int argc
, char **argv
, void *opt
,
227 for (i
= 1; i
< argc
; ++i
) {
228 if (strcmp(argv
[i
], "--help") == 0)
229 print_help_and_exit(arg
, argv
[0]);
232 while (argc
> 1 + skip
) {
233 if (parse_option(arg
, argv
[1 + skip
], NULL
, opt
))
234 argc
= drop_argument(argc
, argv
, 1 + skip
);
235 else if (ISL_FL_ISSET(flags
, ISL_ARG_ALL
)) {
236 fprintf(stderr
, "unrecognized option: %s\n",