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",